146 lines
4.1 KiB
JavaScript
146 lines
4.1 KiB
JavaScript
var AmiUserPerms = function(perms) {
|
|
var rank = parseInt(perms[0] || '0');
|
|
var values = {
|
|
'baka': perms[1] !== '0',
|
|
'ban': 'baka',
|
|
'kick': 'baka',
|
|
'view-logs': perms[2] !== '0',
|
|
'set-nick-name': perms[3] !== '0',
|
|
'create-channel': perms[4] !== '0',
|
|
'create-temp-channel': perms[4] === '1',
|
|
'create-perm-channel': perms[4] === '2',
|
|
};
|
|
|
|
var can = function(perm) {
|
|
perm = values[perm];
|
|
if(typeof perm === 'string')
|
|
return can(perm);
|
|
return perm;
|
|
};
|
|
|
|
return {
|
|
getRank: function() { return rank; },
|
|
can: can,
|
|
compare: function(other) {
|
|
var diff = [];
|
|
for(var perm in values)
|
|
if(can(perm) !== other.can(perm))
|
|
diff.push(perm);
|
|
return diff;
|
|
},
|
|
};
|
|
};
|
|
|
|
var AmiUser = function(args) {
|
|
var id = args.id,
|
|
hidden = !!args.hidden,
|
|
name = undefined,
|
|
colour = undefined,
|
|
perms = undefined;
|
|
|
|
var awayStatus = undefined,
|
|
isNickName = false;
|
|
|
|
var afkPfx = '<', afkSfx = '>_', nickPfx = '~';
|
|
|
|
var setName = function(newName) {
|
|
if(newName.indexOf(afkPfx) === 0) {
|
|
var tagEnd = newName.indexOf(afkSfx);
|
|
if(tagEnd > afkSfx.length) {
|
|
awayStatus = newName.substring(afkPfx.length, tagEnd);
|
|
newName = newName.substring(tagEnd + afkSfx.length);
|
|
} else awayStatus = undefined;
|
|
} else awayStatus = undefined;
|
|
|
|
isNickName = newName.indexOf(nickPfx) === 0;
|
|
if(isNickName)
|
|
newName = newName.substring(nickPfx.length);
|
|
|
|
name = newName;
|
|
};
|
|
|
|
var setColour = function(newColour) {
|
|
colour = newColour;
|
|
};
|
|
|
|
var setPerms = function(newPerms) {
|
|
perms = new AmiUserPerms(newPerms);
|
|
};
|
|
|
|
setName(args.name);
|
|
setColour(args.colour);
|
|
setPerms(args.perms);
|
|
|
|
var getName = function() { return name; };
|
|
var getFullName = function() {
|
|
var pfx = '';
|
|
if(awayStatus !== undefined)
|
|
pfx += afkPfx + awayStatus + afkSfx;
|
|
if(isNickName)
|
|
pfx += nickPfx;
|
|
return pfx + name;
|
|
};
|
|
|
|
var getColour = function() { return colour; };
|
|
var getPerms = function() { return perms; };
|
|
var isHidden = function() { return hidden; };
|
|
|
|
return {
|
|
getId: function() { return id; },
|
|
|
|
getName: getName,
|
|
getFullName: getFullName,
|
|
isAway: function() { return awayStatus !== undefined; },
|
|
getAwayStatus: function() { return awayStatus; },
|
|
hasNickName: function() { return isNickName; },
|
|
setName: setName,
|
|
|
|
getColour: getColour,
|
|
setColour: setColour,
|
|
|
|
getPerms: getPerms,
|
|
setPerms: setPerms,
|
|
|
|
isHidden: isHidden,
|
|
|
|
compare: function(other) {
|
|
var diff = { diff: [], a: {}, b: {} };
|
|
|
|
var idA = getId(),
|
|
idB = 'id' in other ? other.id : other.getId();
|
|
if(idA !== idB) {
|
|
diff.diff.push('id');
|
|
diff.a.id = idA;
|
|
diff.b.id = idB;
|
|
}
|
|
|
|
var nameA = getFullName(),
|
|
nameB = 'name' in other ? other.name : other.getFullName();
|
|
if(nameA !== nameB) {
|
|
diff.diff.push('name');
|
|
diff.a.name = nameA;
|
|
diff.b.name = nameB;
|
|
}
|
|
|
|
var colourA = getColour(),
|
|
colourB = 'colour' in other ? other.colour : other.getColour();
|
|
if(colourA !== colourB) {
|
|
diff.diff.push('colour');
|
|
diff.a.colour = colourA;
|
|
diff.b.colour = colourB;
|
|
}
|
|
|
|
var permsA = getPerms(),
|
|
permsB = 'perms' in other ? new AmiUserPerms(other.perms) : other.getPerms(),
|
|
permsDiff = permsA.compare(permsB);
|
|
if(permsDiff.length > 0) {
|
|
diff.diff.push('perms');
|
|
diff.a.perms = permsA;
|
|
diff.b.perms = permsB;
|
|
}
|
|
|
|
return diff;
|
|
},
|
|
};
|
|
};
|