rbxjs-plus
Version:
A system allowing access to roblox functions.
229 lines (219 loc) • 6.56 kB
JavaScript
// Dependencies
var parser = require('cheerio');
var Promise = require('bluebird');
// Includes
var http = require('../util/http.js').func;
var jar = require('../util/jar.js').func;
var getRole = require('./getRole.js').func;
var getRoles = require('./getRoles.js').func;
var generalRequest = require('../util/generalRequest.js').func;
var threaded = require('../util/threaded.js').func;
// Args
exports.required = ['group'];
exports.optional = [['rank', 'roleset', 'name'], 'page', 'stream'];
// Define
var maxPageSize = 12;
function getPlayers (group, rankIndex, role, page, body) {
var $ = parser.load(body);
var pager = $('.paging_pagenums_container');
var totalPages = pager.length > 0 ? parseInt(pager.text(), 10) : 1;
if (group) {
var found = $('.GroupMember');
var players = group.players;
for (var i = 0; i < found.length; i++) {
var player = found.eq(i);
var link = player.find('a').first();
var img = player.find('.OnlineStatus').find('img').first();
var element = {
id: parseInt(link.attr('href').substring(29), 10),
name: link.attr('title'),
online: img.attr('src') === '../images/online.png',
parent: {
role: role,
page: page,
rankIndex: rankIndex
},
index: ((page - 1) * maxPageSize + i)
};
if (group.stream) {
group.stream.write(element);
} else {
players.push(element);
}
}
}
$ = null;
body = null;
return totalPages;
}
exports.func = function (args) {
var page = args.page;
var groupId = args.group;
var option;
var optionName;
var getStatus = function () {
return 0;
};
if (args.rank) {
option = args.rank;
optionName = 'rank';
} else if (args.roleset) {
option = args.roleset;
optionName = 'id';
} else if (args.name) {
option = args.name;
optionName = 'name';
}
var isArray = page instanceof Array;
var group = {
players: [],
stream: args.stream || false,
totalPages: []
};
if (page && !isArray) {
page = [page];
} else if (page) {
page = page.sort(function (a, b) {
return a - b;
});
}
if (option && !(option instanceof Array)) {
option = [option];
}
function getPages (inputs, rankIndex, role, pages, totalPages) {
function getPage (i) {
var page = isArray ? pages[i] : i;
if (page > totalPages) {
return Promise.resolve();
}
var httpOpt = {
url: '//www.roblox.com/Groups/Group.aspx?gid=' + groupId,
options: {
method: 'POST',
form: inputs,
headers: {
'User-Agent': 'Mozilla'
},
jar: jar()
}
};
var form = httpOpt.options.form;
form.ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$PageTextBox = page;
form.ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlUsers_Footer$ctl01$HiddenInputButton = '';
return http(httpOpt)
.then(function (body) {
getPlayers(group, rankIndex, role, page, body);
});
}
var start, end;
var isArray = pages instanceof Array;
if (isArray) {
start = 0;
end = pages.length;
} else {
start = 2;
end = pages + 1;
}
return threaded({getPage: getPage, start: start, end: end});
}
function getRolesets (group, groupId, roles, pages, all) {
var jobs = [];
var statuses = [];
for (var i = 0; i < roles.length; i++) {
(function (i) {
var role = roles[i];
var id = role.ID;
var opt = {
url: '//www.roblox.com/Groups/Group.aspx?gid=' + groupId,
getBody: true,
ignoreCache: true,
events: {
ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlRolesetList: id,
ctl00$cphRoblox$rbxGroupRoleSetMembersPane$currentRoleSetID: id,
__EVENTTARGET: 'ctl00$cphRoblox$rbxGroupRoleSetMembersPane$dlRolesetList',
__ASYNCPOST: 'true'
},
jar: jar(), // Must be an empty jar or stuff just doesn't work correctly
http: {
headers: {
'User-Agent': 'Mozilla'
}
}
};
jobs.push(generalRequest(opt)
.then(function (response) {
var body = response.res.body;
var inputs = {
__EVENTTARGET: '',
__VIEWSTATE: body.match(/__VIEWSTATE\|(.*?)\|/)[1],
__EVENTVALIDATION: body.match(/__EVENTVALIDATION\|(.*?)\|/)[1],
__ASYNCPOST: 'true',
ctl00$cphRoblox$rbxGroupRoleSetMembersPane$currentRoleSetID: id
};
var first = pages ? pages.indexOf(1) : 0;
var totalPages = getPlayers(first !== -1 ? group : null, i, role, 1, body, all);
group.totalPages.push({
role: role,
total: totalPages
});
var page = pages;
if (pages && first !== -1) {
page = pages.slice();
page.splice(first, 1);
}
var promise = getPages(inputs, i, role, page || totalPages, totalPages);
statuses.push({
completed: promise.getCompleted,
expected: promise.getExpected
});
return promise;
}));
})(i);
}
getStatus = function () {
var completed = 0;
var expected = 0;
for (var i = 0; i < statuses.length; i++) {
completed += statuses[i].completed();
expected += statuses[i].expected();
}
return Math.round((completed / expected) * 10000) / 100 || 0;
};
return Promise.all(jobs).then(function () {
if (group.stream) {
group.stream.end();
} else {
group.players = group.players.sort(function (a, b) {
return a.parent.rankIndex - b.parent.rankIndex || a.index - b.index;
});
}
return group;
});
}
var promise;
if (optionName === 'id') {
promise = getRolesets({ID: option});
} else {
var rolesets;
if (option) {
rolesets = [];
var opt = {
group: groupId
};
opt[optionName] = option;
promise = getRole(opt)
.then(function (roles) {
return getRolesets(group, groupId, roles, page, false);
});
} else {
promise = getRoles({group: groupId})
.then(function (roles) {
return getRolesets(group, groupId, option ? rolesets : roles, page, true);
});
}
}
promise.getStatus = function () {
return getStatus();
};
return promise;
};