ami/src/ami.js/users.js

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;
},
};
};