nobloxmmc.js
Version:
A Node.js wrapper for ROBLOX. (original from sentanos)
148 lines (139 loc) • 4.38 kB
JavaScript
var parser = require('cheerio')
var http = require('../util/http.js').func
var getDate = require('../util/getDate.js').func
var getVerification = require('../util/getVerification.js').func
var getVerificationInputs = require('../util/getVerificationInputs.js').func
var threaded = require('../util/threaded.js').func
exports.required = ['group']
exports.optional = ['page', 'stream', 'view', 'jar']
function getPosts (wall, body, page, view) {
var $ = parser.load(body)
var available = $('#ctl00_cphRoblox_GroupWallPane_GroupWall_ctrl0_NoWallPostsPanel').length === 0
if (!available) {
if (wall) {
wall.totalPages = 0
return
} else {
return 0
}
}
var totalPages = parseInt(/Page (\d+)/.exec($('#ctl00_cphRoblox_GroupWallPane_GroupWallPager_ctl01_Div1').text())[1], 10)
if (wall) {
var posts = $('.GroupWall_PostContainer')
for (let i = 0; i < posts.length; i++) {
let container = posts.eq(i)
let post = container.parent().parent()
let user = post.find('.UserLink').find('a')
let element = {
content: container.text(),
author: {
id: parseInt(user.attr('href').match(/\d+/)[0], 10),
name: user.text().trim()
},
date: getDate({ time: post.find('.GroupWall_PostDate').find('span').eq(0).text(), timezone: 'CT' }),
parent: {
page: page,
index: i
},
id: parseInt(post.find('.AbuseButton').find('a').attr('href').match(/groupwallpost\?id=(\d+)/)[1], 10) // In fact wall posts do have IDs (as all reportable items have to have) but other than for reporting it isn't really exposed to be used
}
if (wall.stream) {
wall.stream.write(element)
} else {
wall.posts.push(element)
}
}
wall.totalPages = totalPages
if (view) {
if (!wall.views) {
wall.views = []
}
wall.views[page] = getVerificationInputs({ selector: $ })
}
}
$ = null
body = null
if (!wall) {
return totalPages
}
}
exports.func = function (args) {
var page = args.page
var jar = args.jar
var group = args.group
var view = args.view
var getStatus = function () {
return 0
}
var isArray = page instanceof Array
var wall = {
posts: [],
stream: args.stream || false
}
if (page && !isArray) {
page = [page]
}
function getPages (inputs, pages, totalPages) {
var start, end
var isArray = pages instanceof Array
if (isArray) {
start = 0
end = pages.length
} else {
start = 2
end = pages + 1
}
function getPage (i) {
var page = isArray ? pages[i] : i
if (page <= totalPages && page > 0) {
var httpOpt = {
url: '//www.roblox.com/My/Groups.aspx?gid=' + group,
options: {
method: 'POST',
form: inputs,
jar: jar
}
}
var form = httpOpt.options.form
form.ctl00$cphRoblox$GroupWallPane$GroupWallPager$ctl01$PageTextBox = page
form.ctl00$cphRoblox$GroupWallPane$GroupWallPager$ctl01$HiddenInputButton = ''
return http(httpOpt)
.then(function (body) {
getPosts(wall, body, page, view)
})
}
}
var operation = threaded({ getPage: getPage, start: start, end: end })
getStatus = operation.getStatus
return operation.then(function () {
if (wall.stream) {
wall.stream.end()
} else {
wall.posts = wall.posts.sort(function (a, b) {
return b.id - a.id
})
}
return wall
})
}
var promise = getVerification({ url: '//www.roblox.com/My/Groups.aspx?gid=' + group, jar: jar, getBody: true, ignoreCache: true })
.then(function (response) {
var inputs = response.inputs
var first = page ? page.indexOf(1) : 0
var totalPages = getPosts(first !== -1 ? wall : null, response.body, 1, view) || wall.totalPages
if (Number.isNaN(totalPages)) {
throw new Error('You do not have permission to view the wall')
} else if (totalPages === 0) {
wall.totalPages = 0
return wall
}
if (page && first !== -1) {
page.splice(first, 1)
}
return getPages(inputs, page || totalPages, totalPages)
})
promise.getStatus = function () {
return getStatus()
}
return promise
}