2013-10-09 17:53:25 +02:00
|
|
|
|
/*
|
|
|
|
|
* This file contains the weechat models and various
|
|
|
|
|
* helper methods to work with them.
|
|
|
|
|
*/
|
|
|
|
|
var models = angular.module('weechatModels', []);
|
|
|
|
|
|
2013-10-26 15:00:34 +02:00
|
|
|
|
models.service('models', ['$rootScope', '$filter', function($rootScope, $filter) {
|
2013-10-09 17:53:25 +02:00
|
|
|
|
/*
|
|
|
|
|
* Buffer class
|
|
|
|
|
*/
|
|
|
|
|
this.Buffer = function(message) {
|
|
|
|
|
// weechat properties
|
|
|
|
|
var fullName = message['full_name']
|
|
|
|
|
var shortName = message['short_name']
|
|
|
|
|
var title = message['title']
|
|
|
|
|
var number = message['number']
|
|
|
|
|
var pointer = message['pointers'][0]
|
2013-10-16 00:32:56 +02:00
|
|
|
|
var local_variables = message['local_vars'];
|
2013-10-23 15:29:28 +02:00
|
|
|
|
var notify = 3 // Default 3 == message
|
2013-10-09 17:53:25 +02:00
|
|
|
|
var lines = []
|
2013-10-26 22:19:13 +02:00
|
|
|
|
var nicklist = {}
|
2013-10-27 10:48:20 +01:00
|
|
|
|
var flatnicklist = []
|
2013-10-15 14:59:06 +02:00
|
|
|
|
var active = false
|
|
|
|
|
var notification = 0
|
|
|
|
|
var unread = 0
|
2013-12-14 00:59:51 +01:00
|
|
|
|
var lastSeen = -1
|
2013-12-08 22:29:48 +01:00
|
|
|
|
var serverSortKey = fullName.replace(/^irc.server.(\w+)/, "irc.$1");
|
|
|
|
|
|
|
|
|
|
var indent = function(predicate) {
|
|
|
|
|
if( predicate == "serverSortKey" && fullName.match(/^irc./) && !fullName.match(/^irc.server./) ) {
|
|
|
|
|
// indent channel
|
|
|
|
|
return " "; // four protected spaces
|
|
|
|
|
} else {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-10-09 17:53:25 +02:00
|
|
|
|
|
2013-10-18 15:58:26 +02:00
|
|
|
|
// Buffer opened message does not include notify level
|
2013-10-23 15:29:28 +02:00
|
|
|
|
if( message['notify'] != undefined ) {
|
2013-10-18 15:58:26 +02:00
|
|
|
|
notify = message['notify'];
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-09 17:53:25 +02:00
|
|
|
|
/*
|
|
|
|
|
* Adds a line to this buffer
|
|
|
|
|
*
|
|
|
|
|
* @param line the BufferLine object
|
|
|
|
|
* @return undefined
|
|
|
|
|
*/
|
|
|
|
|
var addLine = function(line) {
|
|
|
|
|
lines.push(line);
|
|
|
|
|
}
|
2013-10-15 14:59:06 +02:00
|
|
|
|
|
2013-10-26 22:19:13 +02:00
|
|
|
|
/*
|
|
|
|
|
* Adds a nick to nicklist
|
|
|
|
|
*/
|
2013-10-27 00:26:17 +02:00
|
|
|
|
var addNick = function(group, nick) {
|
|
|
|
|
nicklist[group].nicks.push(nick);
|
2013-10-27 10:48:20 +01:00
|
|
|
|
flatnicklist = getFlatNicklist();
|
2013-10-26 22:19:13 +02:00
|
|
|
|
}
|
2013-10-27 00:26:17 +02:00
|
|
|
|
/*
|
|
|
|
|
* Deletes a nick from nicklist
|
|
|
|
|
*/
|
|
|
|
|
var delNick = function(group, nick) {
|
|
|
|
|
var group = nicklist[group];
|
|
|
|
|
group.nicks = _.filter(group.nicks, function(n) { return n.name != nick.name});
|
2013-10-27 10:48:20 +01:00
|
|
|
|
flatnicklist = getFlatNicklist();
|
2013-10-27 00:26:17 +02:00
|
|
|
|
/*
|
|
|
|
|
for(i in group.nicks) {
|
|
|
|
|
if(group.nicks[i].name == nick.name) {
|
|
|
|
|
delete group.nicks[i];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Updates a nick in nicklist
|
|
|
|
|
*/
|
|
|
|
|
var updateNick = function(group, nick) {
|
|
|
|
|
var group = nicklist[group];
|
|
|
|
|
for(i in group.nicks) {
|
|
|
|
|
if(group.nicks[i].name == nick.name) {
|
|
|
|
|
group.nicks[i] = nick;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-10-27 10:48:20 +01:00
|
|
|
|
flatnicklist = getFlatNicklist();
|
2013-10-27 00:26:17 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-27 10:48:20 +01:00
|
|
|
|
/*
|
|
|
|
|
* Maintain a cached version of a flat sorted nicklist
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
var getFlatNicklist = function() {
|
|
|
|
|
var newlist = [];
|
|
|
|
|
_.each(nicklist, function(nickGroup) {
|
|
|
|
|
_.each(nickGroup.nicks, function(nickObj) {
|
|
|
|
|
newlist.push(nickObj.name);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
newlist.sort(function(a, b) {
|
|
|
|
|
return a.toLowerCase() < b.toLowerCase() ? -1 : 1;
|
|
|
|
|
});
|
|
|
|
|
return newlist;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var flatNicklist = function() {
|
|
|
|
|
return flatnicklist;
|
|
|
|
|
}
|
2013-10-26 22:19:13 +02:00
|
|
|
|
|
2013-10-09 17:53:25 +02:00
|
|
|
|
return {
|
|
|
|
|
id: pointer,
|
|
|
|
|
fullName: fullName,
|
|
|
|
|
shortName: shortName,
|
|
|
|
|
number: number,
|
|
|
|
|
title: title,
|
|
|
|
|
lines: lines,
|
2013-10-12 20:44:40 +02:00
|
|
|
|
addLine: addLine,
|
|
|
|
|
lastSeen: lastSeen,
|
2013-10-15 14:59:06 +02:00
|
|
|
|
unread: unread,
|
|
|
|
|
notification: notification,
|
2013-10-16 00:32:56 +02:00
|
|
|
|
localvars: local_variables,
|
|
|
|
|
notify: notify,
|
2013-10-27 00:26:17 +02:00
|
|
|
|
nicklist: nicklist,
|
|
|
|
|
addNick: addNick,
|
|
|
|
|
delNick: delNick,
|
2013-10-27 10:48:20 +01:00
|
|
|
|
updateNick: updateNick,
|
2013-12-08 22:29:48 +01:00
|
|
|
|
flatNicklist: flatNicklist,
|
|
|
|
|
serverSortKey: serverSortKey,
|
|
|
|
|
indent: indent
|
2013-10-09 17:53:25 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* BufferLine class
|
|
|
|
|
*/
|
|
|
|
|
this.BufferLine = function(message) {
|
2013-10-26 10:30:35 +02:00
|
|
|
|
var buffer = message['buffer'];
|
|
|
|
|
var date = message['date'];
|
2013-10-26 15:00:34 +02:00
|
|
|
|
var shortTime = $filter('date')(date, 'HH:mm');
|
2013-10-09 17:53:25 +02:00
|
|
|
|
|
2013-10-26 10:30:35 +02:00
|
|
|
|
function addClasses(textElements) {
|
|
|
|
|
var typeToClassPrefixFg = {
|
|
|
|
|
'option': 'cof-',
|
|
|
|
|
'weechat': 'cwf-',
|
|
|
|
|
'ext': 'cef-'
|
|
|
|
|
};
|
|
|
|
|
var typeToClassPrefixBg = {
|
|
|
|
|
'option': 'cob-',
|
|
|
|
|
'weechat': 'cwb-',
|
|
|
|
|
'ext': 'ceb-'
|
|
|
|
|
};
|
|
|
|
|
textElements.forEach(function(textEl) {
|
|
|
|
|
textEl.classes = [];
|
|
|
|
|
|
|
|
|
|
// foreground color
|
|
|
|
|
var prefix = typeToClassPrefixFg[textEl.fgColor.type];
|
|
|
|
|
textEl.classes.push(prefix + textEl.fgColor.name);
|
|
|
|
|
|
|
|
|
|
// background color
|
|
|
|
|
prefix = typeToClassPrefixBg[textEl.bgColor.type];
|
|
|
|
|
textEl.classes.push(prefix + textEl.bgColor.name);
|
|
|
|
|
|
|
|
|
|
// attributes
|
|
|
|
|
if (textEl.attrs.name !== null) {
|
|
|
|
|
textEl.classes.push('coa-' + textEl.attrs.name);
|
|
|
|
|
}
|
|
|
|
|
for (var attr in textEl.attrs.override) {
|
|
|
|
|
val = textEl.attrs.override[attr];
|
|
|
|
|
if (val) {
|
|
|
|
|
textEl.classes.push('a-' + attr);
|
|
|
|
|
} else {
|
|
|
|
|
textEl.classes.push('a-no-' + attr);
|
|
|
|
|
}
|
2013-10-09 17:53:25 +02:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-10-26 10:30:35 +02:00
|
|
|
|
var prefix = weeChat.Protocol.rawText2Rich(message['prefix']);
|
|
|
|
|
addClasses(prefix);
|
2013-10-12 02:37:11 +02:00
|
|
|
|
|
2013-10-09 17:53:25 +02:00
|
|
|
|
var tags_array = message['tags_array'];
|
|
|
|
|
var displayed = message['displayed'];
|
|
|
|
|
var highlight = message['highlight'];
|
2013-10-26 10:30:35 +02:00
|
|
|
|
var content = weeChat.Protocol.rawText2Rich(message['message']);
|
|
|
|
|
addClasses(content);
|
2013-10-12 02:37:11 +02:00
|
|
|
|
|
2013-12-17 15:37:22 +01:00
|
|
|
|
if (highlight) {
|
|
|
|
|
prefix.forEach(function(textEl) {
|
|
|
|
|
textEl.classes.push('highlight');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-10 12:24:11 +02:00
|
|
|
|
var rtext = "";
|
2013-10-12 02:37:11 +02:00
|
|
|
|
if(content[0] != undefined) {
|
|
|
|
|
rtext = content[0]['text'];
|
2013-10-09 17:53:25 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-12 22:07:46 +02:00
|
|
|
|
return {
|
2013-10-12 02:37:11 +02:00
|
|
|
|
prefix: prefix,
|
2013-10-09 17:53:25 +02:00
|
|
|
|
content: content,
|
|
|
|
|
date: date,
|
2013-10-26 15:00:34 +02:00
|
|
|
|
shortTime: shortTime,
|
2013-10-09 17:53:25 +02:00
|
|
|
|
buffer: buffer,
|
|
|
|
|
tags: tags_array,
|
|
|
|
|
highlight: highlight,
|
|
|
|
|
displayed: displayed,
|
2013-10-10 12:24:11 +02:00
|
|
|
|
text: rtext,
|
2013-10-26 10:30:35 +02:00
|
|
|
|
|
2013-10-09 17:53:25 +02:00
|
|
|
|
}
|
|
|
|
|
|
2013-10-27 09:49:59 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function nickGetColorClasses(nickMsg, propName) {
|
|
|
|
|
if (propName in nickMsg && nickMsg[propName] && nickMsg[propName].length > 0) {
|
|
|
|
|
var color = nickMsg[propName];
|
|
|
|
|
if (color.match(/^weechat/)) {
|
|
|
|
|
// color option
|
|
|
|
|
var colorName = color.match(/[a-zA-Z0-9_]+$/)[0];
|
|
|
|
|
return [
|
|
|
|
|
'cof-' + colorName,
|
|
|
|
|
'cob-' + colorName,
|
|
|
|
|
'coa-' + colorName
|
|
|
|
|
];
|
|
|
|
|
} else if (color.match(/^[a-zA-Z]+$/)) {
|
|
|
|
|
// WeeChat color name
|
|
|
|
|
return [
|
|
|
|
|
'cwf-' + color
|
|
|
|
|
];
|
2013-10-27 11:04:43 +01:00
|
|
|
|
} else if (color.match(/^[0-9]+$/)) {
|
|
|
|
|
// extended color
|
|
|
|
|
return [
|
|
|
|
|
'cef-' + color
|
|
|
|
|
];
|
2013-10-27 09:49:59 +01:00
|
|
|
|
}
|
2013-10-27 11:04:43 +01:00
|
|
|
|
|
2013-10-27 09:49:59 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return [
|
|
|
|
|
'cwf-default'
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function nickGetClasses(nickMsg) {
|
|
|
|
|
return {
|
|
|
|
|
'name': nickGetColorClasses(nickMsg, 'color'),
|
|
|
|
|
'prefix': nickGetColorClasses(nickMsg, 'prefix_color')
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-26 22:19:13 +02:00
|
|
|
|
/*
|
|
|
|
|
* Nick class
|
|
|
|
|
*/
|
|
|
|
|
this.Nick = function(message) {
|
|
|
|
|
var prefix = message['prefix'];
|
|
|
|
|
var visible = message['visible'];
|
|
|
|
|
var name = message['name'];
|
2013-10-27 09:49:59 +01:00
|
|
|
|
var colorClasses = nickGetClasses(message);
|
2013-10-26 22:19:13 +02:00
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
prefix: prefix,
|
|
|
|
|
visible: visible,
|
|
|
|
|
name: name,
|
2013-10-27 09:49:59 +01:00
|
|
|
|
prefixClasses: colorClasses.prefix,
|
|
|
|
|
nameClasses: colorClasses.name
|
2013-10-26 22:19:13 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Nicklist Group class
|
|
|
|
|
*/
|
|
|
|
|
this.NickGroup = function(message) {
|
|
|
|
|
var name = message['name'];
|
|
|
|
|
var visible = message['visible'];
|
|
|
|
|
var nicks = [];
|
2013-10-09 17:53:25 +02:00
|
|
|
|
|
2013-10-26 22:19:13 +02:00
|
|
|
|
return {
|
|
|
|
|
name: name,
|
|
|
|
|
visible: visible,
|
|
|
|
|
nicks: nicks
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-09 17:53:25 +02:00
|
|
|
|
|
|
|
|
|
var BufferList = []
|
|
|
|
|
activeBuffer = null;
|
2013-10-15 14:59:06 +02:00
|
|
|
|
unreads = 0;
|
|
|
|
|
notifications = 0;
|
2013-10-09 17:53:25 +02:00
|
|
|
|
|
|
|
|
|
this.model = { 'buffers': {} }
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Adds a buffer to the list
|
|
|
|
|
*
|
|
|
|
|
* @param buffer buffer object
|
|
|
|
|
* @return undefined
|
|
|
|
|
*/
|
|
|
|
|
this.addBuffer = function(buffer) {
|
|
|
|
|
BufferList[buffer.id] = buffer;
|
|
|
|
|
if (BufferList.length == 1) {
|
|
|
|
|
activeBuffer = buffer.id;
|
|
|
|
|
}
|
|
|
|
|
this.model.buffers[buffer.id] = buffer;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-12 18:54:13 +02:00
|
|
|
|
this.getBufferByIndex = function(index) {
|
|
|
|
|
var i = 0;
|
|
|
|
|
|
|
|
|
|
for (var v in BufferList) {
|
|
|
|
|
if (index == ++i) {
|
|
|
|
|
return BufferList[v];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-09 17:53:25 +02:00
|
|
|
|
/*
|
|
|
|
|
* Returns the current active buffer
|
|
|
|
|
*
|
|
|
|
|
* @return active buffer object
|
|
|
|
|
*/
|
|
|
|
|
this.getActiveBuffer = function() {
|
|
|
|
|
return activeBuffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Sets the buffer specifiee by bufferId as active.
|
|
|
|
|
* Deactivates the previous current buffer.
|
|
|
|
|
*
|
|
|
|
|
* @param bufferId id of the new active buffer
|
2013-12-14 15:40:11 +01:00
|
|
|
|
* @return true on success, false if buffer was not found
|
2013-10-09 17:53:25 +02:00
|
|
|
|
*/
|
2013-12-14 15:40:11 +01:00
|
|
|
|
this.setActiveBuffer = function(bufferId, key) {
|
|
|
|
|
if (typeof(key) === 'undefined') {
|
|
|
|
|
key = 'id';
|
|
|
|
|
}
|
2013-10-12 20:44:40 +02:00
|
|
|
|
|
|
|
|
|
var previousBuffer = this.getActiveBuffer();
|
2013-10-09 17:53:25 +02:00
|
|
|
|
|
2013-12-14 15:40:11 +01:00
|
|
|
|
activeBuffer = _.find(this.model['buffers'], function(buffer) {
|
|
|
|
|
if (buffer[key] == bufferId) {
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (typeof(activeBuffer) === 'undefined') {
|
|
|
|
|
// Buffer not found, undo assignment
|
|
|
|
|
activeBuffer = previousBuffer;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-12 20:44:40 +02:00
|
|
|
|
if (previousBuffer) {
|
|
|
|
|
// turn off the active status for the previous buffer
|
|
|
|
|
previousBuffer.active = false;
|
|
|
|
|
// Save the last line we saw
|
2013-10-12 21:06:24 +02:00
|
|
|
|
previousBuffer.lastSeen = previousBuffer.lines.length-1;
|
2013-10-09 17:53:25 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
activeBuffer.active = true;
|
2013-10-15 15:21:13 +02:00
|
|
|
|
activeBuffer.unread = 0;
|
|
|
|
|
activeBuffer.notification = 0;
|
2013-10-12 22:07:46 +02:00
|
|
|
|
|
|
|
|
|
$rootScope.$emit('activeBufferChanged');
|
2013-10-15 15:21:13 +02:00
|
|
|
|
$rootScope.$emit('notificationChanged');
|
2013-12-14 15:40:11 +01:00
|
|
|
|
return true;
|
2013-10-09 17:53:25 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Returns the buffer list
|
|
|
|
|
*/
|
|
|
|
|
this.getBuffers = function() {
|
|
|
|
|
return BufferList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Returns a specific buffer object
|
|
|
|
|
*
|
|
|
|
|
* @param bufferId id of the buffer
|
|
|
|
|
* @return the buffer object
|
|
|
|
|
*/
|
|
|
|
|
this.getBuffer = function(bufferId) {
|
|
|
|
|
return _.find(this.model['buffers'], function(buffer) {
|
|
|
|
|
if (buffer['id'] == bufferId) {
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Closes a weechat buffer. Sets the first buffer
|
2013-10-29 12:34:16 +01:00
|
|
|
|
* as active, if the closing buffer was active before
|
2013-10-09 17:53:25 +02:00
|
|
|
|
*
|
|
|
|
|
* @param bufferId id of the buffer to close
|
|
|
|
|
* @return undefined
|
|
|
|
|
*/
|
|
|
|
|
this.closeBuffer = function(bufferId) {
|
2013-10-29 12:34:16 +01:00
|
|
|
|
var wasActive = this.model['buffers'][bufferId.id].active;
|
|
|
|
|
if(wasActive) {
|
|
|
|
|
var firstBuffer = _.keys(this.model['buffers'])[0];
|
|
|
|
|
this.setActiveBuffer(firstBuffer);
|
|
|
|
|
}
|
2013-10-09 17:53:25 +02:00
|
|
|
|
delete(this.model['buffers'][bufferId.id]);
|
|
|
|
|
}
|
|
|
|
|
}]);
|