Updated POST model

This commit is contained in:
CaramelKat
2021-09-06 03:18:23 -05:00
committed by jay.poff@outlook.com
parent a9828d89ed
commit d0c1f45bc9
30 changed files with 839 additions and 910 deletions

32
package-lock.json generated
View File

@@ -216,9 +216,9 @@
}
},
"bson": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz",
"integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg=="
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
},
"buffer-from": {
"version": "1.1.1",
@@ -849,12 +849,12 @@
}
},
"mongodb": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.4.tgz",
"integrity": "sha512-xGH41Ig4dkSH5ROGezkgDbsgt/v5zbNUwE3TcFsSbDc6Qn3Qil17dhLsESSDDPTiyFDCPJRpfd4887dtsPgKtA==",
"version": "3.5.7",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.7.tgz",
"integrity": "sha512-lMtleRT+vIgY/JhhTn1nyGwnSMmJkJELp+4ZbrjctrnBxuLbj6rmLuJFz8W2xUzUqWmqoyVxJLYuC58ZKpcTYQ==",
"requires": {
"bl": "^2.2.0",
"bson": "^1.1.1",
"bson": "^1.1.4",
"denque": "^1.4.1",
"require_optional": "^1.0.1",
"safe-buffer": "^5.1.2",
@@ -862,15 +862,15 @@
}
},
"mongoose": {
"version": "5.9.4",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.4.tgz",
"integrity": "sha512-aUw4hzvJX9UJVN79JcElCwu/YsW1Sl/IDjErwiIX89xz77kmMjQjCmMsXGE1okUEcJGzGnXPqYl9BggXw8Nlvg==",
"version": "5.9.16",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.16.tgz",
"integrity": "sha512-b4HNndgh+dacoLE/2SBF3iBBofeaKL+aGVZH7jnPRc2RXRCplX4sfH5sgoz03ryCSXJ+RQNIfqKAADt/ZBzPDA==",
"requires": {
"bson": "~1.1.1",
"bson": "^1.1.4",
"kareem": "2.3.1",
"mongodb": "3.5.4",
"mongodb": "3.5.7",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.6.0",
"mpath": "0.7.0",
"mquery": "3.2.2",
"ms": "2.1.2",
"regexp-clone": "1.0.0",
@@ -920,9 +920,9 @@
}
},
"mpath": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz",
"integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg=="
},
"mquery": {
"version": "3.2.2",

View File

@@ -19,7 +19,7 @@
"fs-extra": "^9.0.0",
"moment": "^2.24.0",
"moment-timezone": "^0.5.27",
"mongoose": "^5.8.3",
"mongoose": "^5.9.16",
"mongoose-unique-validator": "^2.0.3",
"morgan": "^1.10.0",
"node-rsa": "^1.0.8",

View File

@@ -1,8 +1,11 @@
{
"http": {
"port": 8080
"port": 80
},
"secret": "b213a890ac28739a0fc0e47f034308c1",
"account_server": "account.miiverse.cc:8080",
"secret": "806590af0a2bf0cf9ce54b0b5c1493a1",
"X-Nintendo-Client-ID": "a2efa818a34fa16b8afbc8a74eba3eda",
"X-Nintendo-Client-Secret": "c91cdb5658bd4954ade78533a339cf9a",
"mongoose": {
"uri": "mongodb://localhost:27017",
"database": "Miiverse",
@@ -10,5 +13,8 @@
"useNewUrlParser": true,
"useUnifiedTopology": true
}
}
},
"authorized_PNIDs" : [
1420636409, 1657414049, 1587572630
]
}

View File

@@ -46,9 +46,9 @@ async function getTopicByCommunityID(communityID) {
});
}
async function getCommunities(numberOfPosts) {
async function getCommunities(numberOfCommunities) {
verifyConnected();
return COMMUNITY.find({}).limit(numberOfPosts);
return COMMUNITY.find({}).limit(numberOfCommunities);
}
async function getCommunityByTitleID(title_id) {
@@ -81,6 +81,13 @@ async function getPostsByUserID(userID) {
});
}
async function getNumberPostsByUserID(userID) {
verifyConnected();
return POST.find({
pid: userID
}).countDocuments();
}
async function getHotPostsByCommunity(community, numberOfPosts) {
verifyConnected();
return POST.find({
@@ -134,6 +141,7 @@ module.exports = {
getHotPostsByCommunity,
getPostsByCommunityKey,
getPostsByUserID,
getNumberPostsByUserID,
getPostByID,
getUserByPID,
};

File diff suppressed because one or more lines are too long

View File

@@ -78,7 +78,6 @@
</ul>
</div>
</div>
</div>
OLV_WIIU_NEW_COMMUNITIES
<a href="/communities/categories/wiiu_all" data-pjax="#body" class="more-button scroll">Show More</a>

View File

@@ -15,10 +15,8 @@
<p class="settings-label">Profile Comment</p>
<form method="post" action="/settings/profile" id="profile-text-form">
<textarea id="profile-text" name="profile_comment" maxlength="400" class="scroll-focus"
placeholder="Write about yourself here."
>
</textarea>
placeholder="Write about yourself here.">
</textarea>
<p class="note-attention">Attention</p>
<p class="note">Please refrain from including any of the following information:<br />
- Your address, telephone number, e-mail address, the name of your school, or any other information that could personally identify you. <br />
@@ -36,7 +34,7 @@
<p class="settings-label">Who should be able to see your profile comment?</p>
<a class="settings-button scroll-focus"
href="#" data-modal-open=".settings-page[data-name='profile_comment_visibility']"
>Everyone
>Wii U Friends Only
</a>
</li>
@@ -390,7 +388,7 @@
data-modal-types="select-settings"
data-action="/settings/profile"
data-name="profile.favorite_community_visibility">
data-name="profile_favorite_community_visibility">
<div class="window">
<h1 class="window-title">Profile Settings</h1>
<div class="window-body"><div class="window-body-inner message">

278
src/html/portal/user.html Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,10 +1,7 @@
<div id="body">
<header id="header">
<h1 id="page-title" class="">User Page</h1>
</header>
<div class="body-content user-page is-visitor">
<a id="header-mymenu-button" href="https://portal-us.olv.nintendo.net/my_menu" data-pjax="#body">User Menu</a>
<div class="user-info info-content">
@@ -88,22 +85,22 @@
</div>
<menu class="user-menu tab-header">
<li class="test-user-posts-count tab-button-profile"><a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/posts" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Posts</span><span class="number">0</span></a></li>
<li class="test-user-friends-count tab-button-activity"><a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/friends" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Friends</span><span class="number">0 / 100</span></a></li>
<li class="test-user-followings-count tab-button-activity"><a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/following" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Following</span><span class="number"><span class="js-following-count">0</span> / 1000</span></a></li>
<li class="test-user-followers-count tab-button-relationship"><a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/followers" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Followers</span><span class="number">0</span></a></li>
<li class="test-user-posts-count tab-button-profile"><a href="/users/OLV_USER_PID/posts" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Posts</span><span class="number">OLV_NUMBER_OF_POSTS</span></a></li>
<li class="test-user-friends-count tab-button-activity"><a href="/users/OLV_USER_PID/friends" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Friends</span><span class="number">0 / 100</span></a></li>
<li class="test-user-followings-count tab-button-activity"><a href="/users/OLV_USER_PID/following" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Following</span><span class="number"><span class="js-following-count">0</span> / 1000</span></a></li>
<li class="test-user-followers-count tab-button-relationship"><a href="/users/OLV_USER_PID/followers" data-pjax="#body" data-sound="SE_WAVE_SELECT_TAB"><span class="label">Followers</span><span class="number">0</span></a></li>
</menu>
<div class="tab-body">
<div class="user-button-container with-album-button">
<a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/diary" data-pjax="#body" class="button scroll diary-button">View Play Journal</a>
<a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/album" data-pjax="#body" class="button scroll album-button">View Screenshot Album</a>
<a href="/users/OLV_USER_PID/diary" data-pjax="#body" class="button scroll diary-button">View Play Journal</a>
<a href="/users/OLV_USER_PID/album" data-pjax="#body" class="button scroll album-button">View Screenshot Album</a>
</div>
<div class="profile-content">
<p class="text">..like systemd.</p>
<p class="text">OLV_PROFILE_COMMENT</p>
<div class="user-data"><table>
<tbody><tr>
@@ -117,7 +114,7 @@
<tr class="game-skill">
<th><span>Game Experience</span></th>
<td>
<span class="expert">Expert </span></td>
<span class="OLV_GAME_EXPERIENCE_TAG">OLV_GAME_EXPERIENCE_LABEL</span></td>
</tr>
<tr class="game">
<th><span>Systems Owned</span></th>
@@ -168,13 +165,13 @@
</ul>
</div>
<div class="scroll test-diary-post-list" id="diary_post-post-list">
<!--<div class="scroll test-diary-post-list" id="diary_post-post-list">
<div class="headline"><h2>Recent Play Journal Entries</h2></div>
<div class="no-content">
<p>No Play Journal entries written yet.</p>
</div>
<a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/diary" data-pjax="#body" class="more-button scroll">View Play Journal</a>
</div>
<a href="/users/OLV_USER_PID/diary" data-pjax="#body" class="more-button scroll">View Play Journal</a>
</div>-->
<div class="scroll test-artwork-post-list" id="artwork_post-post-list">
<div class="headline"><h2>Recent Drawings</h2></div>
@@ -183,19 +180,19 @@
</div>
</div>
<div class="js-post-list post-list scroll test-topic-post-list" id="topic_post">
<!--<div class="js-post-list post-list scroll test-topic-post-list" id="topic_post">
<div class="headline"><h2>Open Discussion</h2></div>
<div class="no-content">
<p>No open discussions.</p>
</div>
</div>
</div>-->
<div class="scroll album-content test-album-images-section">
<h2 class="headline">Recently Saved Screenshots</h2>
<div class="no-content">
<p>No screenshots saved yet.</p>
</div>
<a href="https://portal-us.olv.nintendo.net/users/EricDSucksG/album" data-pjax="#body" class="more-button scroll">View Screenshot Album</a>
<a href="/users/OLV_USER_PID/album" data-pjax="#body" class="more-button scroll">View Screenshot Album</a>
</div>
</div>

View File

@@ -1,10 +1,18 @@
const { Schema, model } = require('mongoose');
const CommunitySchema = new Schema({
created_at: {
type: Date,
default: new Date(),
},
empathy_count: {
type: Number,
default: 0
},
followers: {
type: Number,
default: 0
},
id: {
type: Number,
default: 0
@@ -33,6 +41,10 @@ const CommunitySchema = new Schema({
CTR_browser_header: String,
WiiU_browser_header: String,
description: String,
parent: {
type: Number,
default: null
}
});
CommunitySchema.methods.upEmpathy = async function() {
@@ -49,6 +61,20 @@ CommunitySchema.methods.downEmpathy = async function() {
await this.save();
};
CommunitySchema.methods.upFollower = async function() {
const followers = this.get('followers');
this.set('followers', followers + 1);
await this.save();
};
CommunitySchema.methods.downFollower = async function() {
const followers = this.get('followers');
this.set('followers', followers - 1);
await this.save();
};
const COMMUNITY = model('COMMUNITY', CommunitySchema);
module.exports = {

View File

@@ -1,5 +1,5 @@
const { Schema, model } = require('mongoose');
//just testing pull requests
const PostSchema = new Schema({
title_id: String,
screen_name: String,
@@ -19,12 +19,12 @@ const PostSchema = new Schema({
},
community_id: String,
country_id: Number,
created_at: String,
created_at: Date,
feeling_id: Number,
id: Number,
id: String,
is_autopost: {
type: Number,
default: 0
type: Number,
default: 0
},
is_community_private_autopost: {
type: Number,
@@ -55,11 +55,19 @@ const PostSchema = new Schema({
pid: Number,
platform_id: Number,
region_id: Number,
parent_post: Number,
parent_post: String,
reply_count: {
type: Number,
default: 0
},
verified: {
type: Boolean,
default: false
},
parent: {
type: String,
default: null
}
});

View File

@@ -1,9 +1,21 @@
const { Schema, model } = require('mongoose');
const notification = new Schema({
content: String,
link: String,
read: Boolean,
created_at: Date,
});
const UserSchema = new Schema({
pid: Number,
created_at: String,
user_id: String,
birthday: Date,
country: String,
pfp_uri: String,
mii: String,
mii_face_url: String,
/**
* Account Status
* 0 - Fine
@@ -15,13 +27,248 @@ const UserSchema = new Schema({
type: Number,
default: 0
},
mii: String,
ban_lift_date: Date,
ban_reason: String,
official: {
type: Boolean,
default: false
},
profile_comment: {
type: String,
default: undefined
},
game_skill: {
type: Number,
default: 0
},
game_skill_visibility: {
type: Boolean,
default: true
},
profile_comment_visibility: {
type: Boolean,
default: true
},
birthday_visibility: {
type: Boolean,
default: false
},
relationship_visibility: {
type: Boolean,
default: false
},
country_visibility: {
type: Boolean,
default: false
},
profile_favorite_community_visibility: {
type: Boolean,
default: true
},
notifications: {
type: Boolean,
default: false
},
likes: {
type: [Number],
default: [0]
},
followed_communities: {
type: [Number],
default: [0]
},
followed_users: {
type: [Number],
default: [0]
},
following_users: {
type: [Number],
default: [0]
},
followers: {
type: Number,
default: 0
},
following: {
type: Number,
default: 0
},
notification_list: {
type: [notification],
default: [{
content: 'This is your notifications! You\'ll see more stuff here soon!',
link: '/users/me',
read: false,
created_at: new Date(),
}]
}
});
UserSchema.methods.getAccountStatus = async function() {
return this.get('account_status');
};
UserSchema.methods.setAccountStatus = async function(accountStatus) {
this.set('account_status', accountStatus);
await this.save();
};
UserSchema.methods.getBanDate = async function() {
return this.get('ban_lift_date');
};
UserSchema.methods.setBanData = async function(banDate) {
this.set('ban_lift_date', banDate);
await this.save();
};
UserSchema.methods.getProfileComment = async function() {
return this.get('profile_comment');
};
UserSchema.methods.setProfileComment = async function(profileComment) {
this.set('profile_comment', profileComment);
await this.save();
};
UserSchema.methods.getGameSkill = async function() {
return this.get('game_skill');
};
UserSchema.methods.setGameSkill = async function(gameSkill) {
this.set('game_skill', gameSkill);
await this.save();
};
UserSchema.methods.getGameSkillVisibility = async function() {
return this.get('game_skill_visibility');
};
UserSchema.methods.setGameSkillVisibility = async function(gameSkillVisibility) {
this.set('game_skill_visibility', gameSkillVisibility);
await this.save();
};
UserSchema.methods.getProfileCommentVisibility = async function() {
return this.get('profile_comment_visibility');
};
UserSchema.methods.setProfileCommentVisibility = async function(profileCommentVisibility) {
this.set('profile_comment_visibility', profileCommentVisibility);
await this.save();
};
UserSchema.methods.getBirthdayVisibility = async function() {
return this.get('birthday_visibility');
};
UserSchema.methods.setBirthdayVisibility = async function(birthdayVisibility) {
this.set('birthday_visibility', birthdayVisibility);
await this.save();
};
UserSchema.methods.getRelationshipVisibility = async function() {
return this.get('relationship_visibility');
};
UserSchema.methods.setRelationshipVisibility = async function(accountStatus) {
this.set('relationship_visibility', accountStatus);
await this.save();
};
UserSchema.methods.getFavoriteCommunityVisibility = async function() {
return this.get('profile_favorite_community_visibility');
};
UserSchema.methods.setFavoriteCommunityVisibility = async function(favoriteCommunityVisibility) {
this.set('profile_favorite_community_visibility', favoriteCommunityVisibility);
await this.save();
};
UserSchema.methods.getCountryVisibility = async function() {
return this.get('country_visibility');
};
UserSchema.methods.setCountryVisibility = async function(countryVisibility) {
this.set('country_visibility', countryVisibility);
await this.save();
};
UserSchema.methods.addToLikes = async function(postID) {
const likes = this.get('likes');
likes.addToSet(postID);
await this.save();
}
UserSchema.methods.removeFromLike = async function(postID) {
const likes = this.get('likes');
likes.pull(postID);
await this.save();
}
UserSchema.methods.addToCommunities = async function(postID) {
const communities = this.get('followed_communities');
communities.addToSet(postID);
await this.upFollowing();
await this.save();
}
UserSchema.methods.removeFromCommunities = async function(postID) {
const communities = this.get('followed_communities');
communities.pull(postID);
await this.downFollowing();
await this.save();
}
UserSchema.methods.addToUsers = async function(postID) {
const users = this.get('followed_users');
users.addToSet(postID);
await this.upFollowing();
await this.save();
}
UserSchema.methods.removeFromUsers = async function(postID) {
const users = this.get('followed_users');
users.pull(postID);
await this.downFollowing();
await this.save();
}
UserSchema.methods.addToFollowers = async function(postID) {
const users = this.get('following_users');
users.addToSet(postID);
await this.upFollower();
await this.save();
}
UserSchema.methods.removeFromFollowers = async function(postID) {
const users = this.get('following_users');
users.pull(postID);
await this.downFollower();
await this.save();
}
UserSchema.methods.upFollower = async function() {
const followers = this.get('followers');
this.set('followers', followers + 1);
await this.save();
};
UserSchema.methods.downFollower = async function() {
const followers = this.get('followers');
this.set('followers', followers - 1);
await this.save();
};
UserSchema.methods.upFollowing = async function() {
const following = this.get('following');
this.set('following', following + 1);
await this.save();
};
UserSchema.methods.downFollowing = async function() {
const following = this.get('following');
this.set('following', following - 1);
await this.save();
};
const USER = model('USER', UserSchema);
module.exports = {

View File

@@ -10,7 +10,6 @@ const { http: { port } } = config;
const app = express();
const miiverse = require('./services/miiverse-api');
const webApi = require('./services/web-api');
app.set('etag', false);
app.disable('x-powered-by');
@@ -29,7 +28,6 @@ app.use(xmlparser);
// import the servers into one
app.use(miiverse);
app.use(webApi);
// 404 handler
logger.info('Creating 404 status handler');

View File

@@ -29,5 +29,6 @@ discovery.use('/v1/endpoint', routes.DISCOVERY);
api.use('/v1/posts', routes.POST);
api.use('/v1/communities/', routes.COMMUNITY);
api.use('/v1/people/', routes.PEOPLE);
discovery.use('/p01/', routes.POLICY);
module.exports = router;

View File

@@ -5,6 +5,22 @@ const comPostGen = require('../../../util/CommunityPostGen');
const processHeaders = require('../../../util/authentication');
/* GET post titles. */
router.get('/', function (req, res) {
database.connect().then(async e => {
const paramPack = processHeaders.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let community = await database.getCommunityByTitleID(paramPack.title_id);
if (community != null) {
let response = await comPostGen.Communities(community);
res.contentType("application/xml");
res.send(response);
} else {
res.status(404);
res.send();
}
});
});
router.get('/0/posts', function (req, res) {
database.connect().then(async e => {
/* Parse out parameters from URL and headers */

View File

@@ -3,4 +3,5 @@ module.exports = {
POST: require('./post'),
COMMUNITY: require('./communities'),
PEOPLE: require('./people'),
POLICY: require('./policyLists'),
};

View File

@@ -0,0 +1,92 @@
var express = require('express');
var router = express.Router();
const xmlbuilder = require("xmlbuilder");
var multer = require('multer');
var upload = multer();
router.get('/policylist/1/1/US', upload.none(), async function (req, res, next) {
let xml = xmlbuilder.create("result")
.e("has_error", "0").up()
.e("version", "1").up()
.e("request_name", "posts").up()
.e("topic")
.e("community_id", community.community_id).up()
.up()
.e("posts");
let response = {
MajorVersion: 1,
MinorVersion: 0,
ListId: 1924,
DefaultStop: false,
ForceVersionUp: true,
UpdateTime: '2020-03-03T02:51:02+0000',
Priority: {
TitleId: '0005003010016000',
TaskId: 'olvinfo',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '0005003010016100',
TaskId: 'olvinfo',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '0005003010016200',
TaskId: 'olvinfo',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500301001600a',
TaskId: 'olv1',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500301001610a',
TaskId: 'olv1',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500301001620a',
TaskId: 'olv1',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '0005001010040000',
TaskId: 'oltopic',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '0005001010040100',
TaskId: 'oltopic',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '0005001010040200',
TaskId: 'oltopic',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500101005a000',
TaskId: 'Chat',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500101005a100',
TaskId: 'Chat',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500101005a200',
TaskId: 'Chat',
Level: 'EXPEDITE',
},
Priority: {
TitleId: '000500101004c100',
TaskId: 'plog',
Level: 'EXPEDITE',
},
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
});
module.exports = router;

View File

@@ -15,7 +15,8 @@ router.post('/', upload.none(), async function (req, res, next) {
{
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid == null)
console.log(pid);
if(pid === null)
{
throw new Error('The User token was not valid');
}
@@ -23,7 +24,6 @@ router.post('/', upload.none(), async function (req, res, next) {
{
let usrObj;
usrObj = await util.data.processUser(pid);
const creationDate = moment().format('YYYY-MM-DD HH:MM:SS');
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
@@ -53,7 +53,7 @@ router.post('/', upload.none(), async function (req, res, next) {
topic_tag: req.body.topic_tag,
community_id: req.body.community_id,
country_id: paramPackData.country_id,
created_at: creationDate,
created_at: new Date(),
feeling_id: req.body.feeling_id,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
@@ -61,10 +61,11 @@ router.post('/', upload.none(), async function (req, res, next) {
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: usrObj.mii,
mii_face_url: "http://mii-images.account.pretendo.cc/",
mii_face_url: "https://mii-images.account.pretendo.cc/",
pid: pid,
platform_id: paramPackData.platform_id,
region_id: paramPackData.region_id,
parent: null,
};
const newPost = new POST(document);
newPost.save();

View File

@@ -1,35 +0,0 @@
const express = require('express');
const subdomain = require('express-subdomain');
const logger = require('../../logger');
const routes = require('./routes');
// Main router for endpointsindex.js
const router = express.Router();
// Router to handle the subdomain restriction
const api = express.Router();
const web = express.Router();
const ctr = express.Router();
const portal = express.Router();
// Create subdomains
logger.info('[MIIVERSE] Creating \'web api\' subdomain');
router.use(subdomain('web.olv', web));
router.use(subdomain('ctr.olv', ctr));
router.use(subdomain('portal.olv', portal));
// Setup routes
web.use('/', routes.WEB);
ctr.use('/titles/show', routes.CTR);
portal.use('/', routes.PORTAL);
portal.use('/v1/communities/', routes.COMMUNITY);
portal.use('/v1/posts/', routes.POST);
portal.use('/post', routes.NEWPOST);
web.use('/v1/communities/', routes.COMMUNITY);
api.use('/v1/communities/', routes.COMMUNITY);
api.use('/v1/posts/', routes.POST);
api.use('/post', routes.NEWPOST);
api.use('/users/', routes.USERS);
portal.use('/users/', routes.USERS);
module.exports = router;

View File

@@ -1,91 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../database');
var multer = require('multer');
const snowflake = require('node-snowflake').Snowflake;
const consts = require('../../../consts.json');
const { COMMUNITY } = require('../../../models/communities');
let PNG = require('pngjs').PNG;
// configure multer
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
/* GET post titles. */
router.get('/list', function (req, res) {
database.connect().then(async e => {
/* Parse out parameters from URL and headers */
//const paramPack = processHeaders.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
//"[0:1]=1407375153523200"
let community = await database.getCommunities(5);
let formatType = parseInt(req.query.format);
switch(formatType)
{
case 0:
let body = '<form action="">\n' +
' <select id="communities" onchange="getPosts(this.value)">' +
' <option value="">Select a community:</option>\n';
for(let i = 0; i < community.length; i++)
{
body += '<option id=' + community[i].community_id + ' name=' + community[i].title_id[0] + ' value=' + community[i].community_id + '>' + community[i].name + '</option>';
}
body += ' </select> </form>';
body += '<button type="button" onClick="getPosts(-1)">Refresh Table</button>';
res.send('<!DOCTYPE html>'
+ '<html><head>' + '</head><body>' + body + '</body></html>');
break;
case 1:
let response = [];
for(let i = 0; i < community.length; i++)
{
response.push(community[i]);
}
res.send(JSON.stringify(response));
break;
}
});
});
router.get('/images', function (req, res) {
database.connect().then(async e => {
let community = await database.getCommunityByID(req.query.community_id);
let response = {
name: community.name,
description: community.description,
platform_id: community.platform_id,
title_id: community.title_id[0],
CTR_browser_header: community.CTR_browser_header,
WiiU_browser_header: community.WiiU_browser_header,
browser_icon: community.browser_icon
};
res.send(response);
});
});
router.get('/uploads/*', function (req, res) {
let fileName = req.originalUrl.replace('/v1/communities/uploads/', '').trim();
res.sendFile(fileName, { root: './uploads/' });
});
router.post('/new', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), async function (req, res, next) {
const files = JSON.parse(JSON.stringify(req.files));
const document = {
empathy_count: 0,
id: snowflake.nextId(),
has_shop_page: req.body.has_shop_page,
platform_id: req.body.platform_ID,
icon: req.body.icon,
title_ids: req.body.title_ids,
title_id: req.body.title_ids,
community_id: snowflake.nextId(),
is_recommended: req.body.is_recommended,
name: req.body.name,
browser_icon: `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`,
CTR_browser_header: `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`,
WiiU_browser_header: `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`,
description: req.body.description,
};
const newCommunity = new COMMUNITY(document);
newCommunity.save();
res.sendStatus(200)
});
module.exports = router;

View File

@@ -1,12 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../database');
const comPostGen = require('../../../util/CommunityPostGen');
const processHeaders = require('../../../util/authentication');
/* GET post titles. */
router.get('/', function (req, res) {
res.sendFile("ctr.html", { root: 'html' });
});
module.exports = router;

View File

@@ -1,9 +0,0 @@
module.exports = {
USERS: require('./users'),
POST: require('./post'),
NEWPOST: require('./newPost'),
COMMUNITY: require('./communities'),
WEB: require('./web'),
CTR: require('./ctr'),
PORTAL: require('./portal')
};

View File

@@ -1,104 +0,0 @@
var express = require('express');
var router = express.Router();
const moment = require('moment');
var xml = require('object-to-xml');
const { POST } = require('../../../models/post');
const util = require('../../../util/authentication');
const database = require('../../../database');
const snowflake = require('node-snowflake').Snowflake;
var maxSize = 1 * 1000 * 1000;
var multer = require('multer');
var upload = multer({
limits: { fileSize: maxSize }
});
router.post('/', upload.none(), async function (req, res, next) {
try
{
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid == null)
{
throw new Error('The User token was not valid');
}
else
{
let usrObj;
usrObj = await util.data.processUser(pid);
const creationDate = moment().format('YYYY-MM-DD HH:MM:SS');
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "";
if (req.body.painting) {
painting = req.body.painting.replace(/\0/g, "").trim();
}
let paintingURI = "";
if (req.body.painting) {
paintingURI = await util.data.processPainting(painting);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
const document = {
title_id: req.body.olive_title_id,
screen_name: usrObj.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
url: req.body.url,
search_key: req.body.search_key,
topic_tag: req.body.topic_tag,
community_id: req.body.community_id,
country_id: paramPackData.country_id,
created_at: creationDate,
feeling_id: req.body.feeling_id,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: req.body.is_spoiler,
is_app_jumpable: req.body.is_app_jumpable,
language_id: req.body.language_id,
mii: usrObj.mii,
mii_face_url: "http://mii-images.account.pretendo.cc/",
pid: pid,
platform_id: paramPackData.platform_id,
region_id: paramPackData.region_id,
};
const newPost = new POST(document);
newPost.save();
res.sendStatus(200);
}
}
catch (e)
{
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 7,
message: "POSTING_FROM_NNID"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
}
});
router.post('/*/empathies', upload.none(), function (req, res, next) {
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = req.originalUrl.replace('/v1/posts/', '').replace('/empathies','').trim();
database.connect().then(async emp => {
const post = await database.getPostByID(pid);
await post.upEmpathy();
});
res.status(200);
res.send();
});
module.exports = router;

View File

@@ -1,248 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../database');
const fs = require('fs-extra');
const util = require('../../../util/authentication');
const comPostGen = require('../../../util/CommunityPostGen');
const processHeaders = require('../../../util/authentication');
/* GET post titles. */
router.get('/titles/show', function (req, res) {
res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2')
res.redirect('/communities');
});
router.get('/settings/profile', function (req, res) {
res.sendFile("settings_body.html", { root: 'src/html/portal' });
});
router.get('/friend_messages', function (req, res) {
res.sendFile("messages_body.html", { root: 'src/html/portal' });
});
router.get('/news/my_news', function (req, res) {
res.sendFile("notifications_body.html", { root: 'src/html/portal' });
});
router.get('/identified_user_posts', function (req, res) {
res.sendFile("verified_post_body.html", { root: 'src/html/portal' });
});
router.get('/', function (req, res) {
res.sendFile("feed_body.html", { root: 'src/html/portal' });
});
router.get('/users/*', function (req, res) {
res.sendFile("user_body.html", { root: 'src/html/portal' });
});
router.get('/wiiu-emulation.js', function (req, res) {
res.sendFile("wiiu-emulation.js", { root: 'src/html/portal' });
});
router.get('/portal.js', function (req, res) {
res.sendFile("portal.js", { root: 'src/html/portal' });
});
router.get('/portal.css', function (req, res) {
res.sendFile("portal.css", { root: 'src/html/portal' });
});
router.get('/*/wiiu-emulation.js', function (req, res) {
res.sendFile("wiiu-emulation.js", { root: 'src/html/portal' });
});
router.get('/*/portal.js', function (req, res) {
res.sendFile("portal.js", { root: 'src/html/portal' });
});
router.get('/*/portal.css', function (req, res) {
res.sendFile("portal.css", { root: 'src/html/portal' });
});
router.post('/posts/*/empathies', function (req, res, next) {
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = req.originalUrl.replace('/posts/', '').replace('/empathies','').trim();
console.log(pid);
database.connect().then(async emp => {
let post = await database.getPostByID(parseInt(pid));
await post.upEmpathy();
});
res.status(200);
res.send();
});
router.post('/posts/*/empathies.delete', function (req, res, next) {
let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
let pid = req.originalUrl.replace('/posts/', '').replace('/empathies.delete','').trim();
console.log(pid);
database.connect().then(async emp => {
let post = await database.getPostByID(parseInt(pid));
await post.downEmpathy();
});
res.status(200);
res.send();
});
router.post('/posts/*/replies', async function (req, res, next) {
try
{
let postID = req.originalUrl.replace('/posts', '').split('/').pop().split('?')[0];
let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]);
if(pid == null)
{
throw new Error('The User token was not valid');
}
else
{
let usrObj;
usrObj = await util.data.processUser(pid);
const creationDate = moment().format('YYYY-MM-DD HH:MM:SS');
let appData = "";
if (req.body.app_data) {
appData = req.body.app_data.replace(/\0/g, "").trim();
}
let painting = "";
if (req.body.painting) {
painting = req.body.painting.replace(/\0/g, "").trim();
}
let paintingURI = "";
if (req.body.painting) {
paintingURI = await util.data.processPainting(painting);
}
let screenshot = "";
if (req.body.screenshot) {
screenshot = req.body.screenshot.replace(/\0/g, "").trim();
}
const document = {
title_id: req.body.olive_title_id,
screen_name: usrObj.user_id,
body: req.body.body,
app_data: appData,
painting: painting,
painting_uri: paintingURI,
screenshot: screenshot,
url: req.body.url,
created_at: creationDate,
feeling_id: req.body.feeling_id,
id: snowflake.nextId(),
is_autopost: req.body.is_autopost,
is_spoiler: req.body.is_spoiler,
mii: usrObj.mii,
mii_face_url: "http://mii-images.account.pretendo.cc/",
};
const newPost = new POST(document);
newPost.save();
res.sendStatus(200);
}
}
catch (e)
{
res.set("Content-Type", "application/xml");
res.statusCode = 400;
response = {
result: {
has_error: 1,
version: 1,
code: 400,
error_code: 7,
message: "POSTING_FROM_NNID"
}
};
res.send("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
}
});
router.get('/posts/*', function (req, res) {
database.connect().then(async e => {
try
{
let postID = req.originalUrl.replace('/posts', '').split('/').pop().split('?')[0];
console.log(postID);
let post = await database.getPostByID(parseInt(postID));
let community = await database.getCommunityByTitleID(post.title_id);
if(post === null)
res.sendStatus(404);
else
{
let file = '';
if (req.query._pjax === "#body")
file = await fs.readFile(`src/html/portal/post_body.html`, 'utf-8');
else
file = await fs.readFile(`src/html/portal/post.html`, 'utf-8');
let newFile = file.replace(/OLV_DISPLAY_NAME/g, post.screen_name)
.replace(/OLV_TOPIC_TAG/g, post.topic_tag)
.replace(/OLV_ICON_STANDIN/g, community.browser_icon)
.replace(/OLV_COMMUNITY_ID/g, community.community_id)
.replace(/OLV_POST_TIMESTAMP/g, post.created_at)
.replace(/OLV_PAGE_TITLE_STANDIN/g, community.name)
.replace(/OLV_POST_ID/g, post.id);
let postContent = '';
if(post.painting_uri !== undefined && post.painting_uri !== '')
postContent += '<p class="post-content-memo"><img src="' + post.painting_uri +'" class="post-memo"></p>';
else
postContent += '<p class="post-content-text">' + post.body + '</p>';
if(post.screenshot !== undefined && post.screenshot !== '')
postContent += '<p class="post-content-text">' + post.body + '</p>'+
'<p class="post-content-memo"><img src="data:image/png;base64,' + post.screenshot +'" class="post-screenshot"></p>';
else if(post.url !== undefined && post.url !== '')
postContent += '<iframe width="560" height="315" src="' + post.url.replace('/watch?v=', '/embed/') +'" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>';
res.send(newFile.replace('OLV_POST_CONTENT', postContent));
}
}
catch (e) {
res.sendStatus(404);
}
});
});
router.get('/titles/*', function (req, res) {
database.connect().then(async e => {
let communityID = req.originalUrl.replace('/titles/', '').replace('?_pjax=%23body', '');
let community = await database.getCommunityByID(communityID);
if(community === null)
res.sendStatus(404);
else
{
let file = '';
if (req.query._pjax === "#body")
file = await fs.readFile(`src/html/portal/community_body.html`, 'utf-8');
else
file = await fs.readFile(`src/html/portal/community.html`, 'utf-8');
let newFile = file.replace(/COMMUNITY_TITLE_ID_STANDIN/g, communityID)
.replace(/OLV_TITLEID_STANDIN/g, community.title_id[0])
.replace(/OLV_ICON_STANDIN/g, community.browser_icon)
.replace(/OLV_HEADER_STANDIN/g, community.WiiU_browser_header)
.replace(/OLV_PAGE_TITLE_STANDIN/g, community.name)
res.send(newFile);
}
});
});
router.get('/communities', function (req, res) {
database.connect().then(async e => {
let communities = await database.getCommunities(6);
if(communities === null)
res.sendStatus(404);
else
{
let file = '';
if (req.query._pjax === "#body")
file = await fs.readFile(`src/html/portal/communities_body.html`, 'utf-8');
else
file = await fs.readFile(`src/html/portal/communities.html`, 'utf-8');
let communityBody = '<ul class="list-content-with-icon-column" id="community-top-content">';
for(let i = 0; i < communities.length; i++)
{
communityBody += '<li id="community-' + communities[i].community_id + '" class="">' +
'<span class="icon-container"><img src="' + communities[i].browser_icon + '" class="icon"></span>' +
'<a href="/titles/' + communities[i].community_id + '" data-pjax="#body" class="scroll to-community-button"></a>' +
'<div class="body">' +
'<div class="body-content">' +
'<span class="community-name title">' + communities[i].name + '</span>';
switch(parseInt(communities[i].platform_id))
{
case 0:
communityBody += '<span class="platform-tag platform-tag-wiiu"></span><span class="text">Wii U Games</span>';
break;
case 1:
communityBody += '<span class="platform-tag platform-tag-3ds"></span><span class="text">3DS Games</span>';
break;
case 2:
communityBody += '<span class="platform-tag platform-tag-wiiu-3ds"></span><span class="text">Both Platform Games</span>';
break;
}
}
res.send(file.replace('OLV_WIIU_NEW_COMMUNITIES', communityBody + '</div></div></li>'));
}
});
});
module.exports = router;

View File

@@ -1,148 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../database');
const consts = require('../../../consts.json');
router.get('/', function (req, res) {
database.connect().then(async e => {
/* Parse out parameters from URL and headers */
//const paramPack = processHeaders.data.decodeParamPack(req.headers["x-nintendo-parampack"]);
//"[0:1]=1407375153523200"
let community = await database.getCommunityByID(req.query.community_id);
let posts;
console.log(parseFloat(req.query.community_id));
switch(parseFloat(req.query.type))
{
case 0:
posts = await database.getPostsByCommunity(community, parseInt(req.query.limit));
break;
case 1:
posts = await database.getHotPostsByCommunity(community, parseInt(req.query.limit));
break;
}
let formatType = parseInt(req.query.format);
let body = '';
let platformIDTag = '';
switch(parseInt(community.platform_id))
{
case 0:
platformIDTag = consts.Wii_U_Platform_Tag;
break;
case 1:
platformIDTag = consts.CTR_Platform_Tag;
break;
case 2:
platformIDTag = consts.Both_Platform_Tag;
break;
}
switch(formatType)
{
case 0:
body = '<table id="posts"><tbody><tr>' +
'<th>Icon</th>' +
'<th>Description</th></tr>' +
'<tr><td><img src="' + community.browser_icon + '" width=auto height=auto></td>' +
'<td>' + community.description +'</td></tr>' +
'<th>Screen Name</th>' +
'<th>Body Text</th>' +
'<th>Yeah Count</th>' +
'<th>Painting</th>' +
'</tr>';
for(let i = 0; i < posts.length; i++)
{
let paintingURI;
if(posts[i].painting_uri === undefined)
paintingURI = consts.No_Painting;
else
paintingURI = posts[i].painting_uri;
let postBody;
if(posts[i].body === undefined)
postBody = 'No text';
else
postBody = posts[i].body;
body += '<tr id="' + posts[i].id + '">' + '<td><a href="/users/' + posts[i].pid + '">' + posts[i].screen_name + '</a></td>' +
'<td>' + '<a href="/posts/' + posts[i].id + '">' + postBody + '</a></td>' +
'<td>' + posts[i].empathy_count + '</td>' +
'<td><img src="' + paintingURI + '" width=auto height=auto></td>';
}
body += '</tbody>' + '</table>';
res.send('<!DOCTYPE html>'
+ '<html><head>' + '</head><body>' + body + '</body></html>');
break;
case 1:
body =
'<table id="posts"><tbody><tr>' +
'<th><img src="' + community.browser_icon + '" width="50%" height=auto></th>' +
'<th><img src="' + platformIDTag + '" width=auto height="75%"></th>' +
'</tr>';
for(let i = 0; i < posts.length; i++)
{
let postBody = '';
if(posts[i].painting_uri === undefined && posts[i].body !== undefined)
postBody = '<td colspan="2">' + '<a>' + posts[i].body + '</a></td>';
else if(posts[i].painting_uri !== undefined && posts[i].body === undefined)
postBody = '<td colspan="2"><img src="' + posts[i].painting_uri + '" width=auto height="75%"></td>';
else
postBody = '<td colspan="2">' + '<a href="/posts/' + posts[i].id + '">No Data</a></td>';
body += '<tr id="' + posts[i].id + '">' + '<td><a href="/users/' + posts[i].pid + '">' + posts[i].screen_name + '</a></td>' +
'<td>Yeah: ' + posts[i].empathy_count + '</td>' +
'<tr>' + postBody + '</tr>';
}
body += '</tbody>' + '</table>';
res.send('<!DOCTYPE html>'
+ '<html><head>' + '</head><body>' + body + '</body></html>');
break;
case 2:
let response = [];
for(let i = 0; i < posts.length; i++)
{
response.push(posts[i]);
}
res.send(JSON.stringify(response));
break;
}
});
});
router.get('/*', function (req, res) {
let post_id = req.originalUrl.replace('/posts/', '').trim();
database.connect().then(async emp => {
const post = await database.getPostByID(post_id);
let post_body;
if(post.body === undefined)
post_body = 'No Text';
else
post_body = post.body;
let post_painting_uri;
if(post.painting_uri === undefined)
post_painting_uri = consts.No_Painting;
else
post_painting_uri = post.painting_uri;
let body =
'<style>\n' +
' table,th,td {\n' +
' border : 1px solid black;\n' +
' border-collapse: collapse;\n' +
' }\n' +
' th,td {\n' +
' padding: 5px;\n' +
' }\n' +
'</style>\n' +
'<table id="posts"><tbody><tr>' +
'<th>Screen Name</th>' +
'<th>Body Text</th>' +
'<th>Yeah Count</th>' +
'<th>Painting</th>' +
'</tr>' +
'<tr id="' + post.id + '">' + '<td><a href="/users/' + post.pid + '">' + post.screen_name + '</a></td>' +
'<td>' + post_body + '</td>' +
'<td>' + post.empathy_count + '</td>' +
'<td><img src="' + post_painting_uri + '" width=auto height=auto></td>' +
'</tbody>' + '</table>';
res.send('<!DOCTYPE html>'
+ '<html><head>' + '</head><body>' + body + '</body></html>');
});
});
module.exports = router;

View File

@@ -1,61 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../database');
const consts = require('../../../consts.json');
router.get('/*/check_can_post.json', function (req, res) {
res.send({"success":1,"remaining_today_posts":30});
});
router.get('/*', function (req, res) {
database.connect().then(async e => {
let PID = req.originalUrl.replace('/users/', '').trim();
let posts = await database.getPostsByUserID(PID);
let userPosts = '';
let totalEmpathy = 0;
for(let i = 0; i < posts.length; i++)
{
totalEmpathy += posts[i].empathy_count;
let paintingURI;
if(posts[i].painting_uri === undefined)
paintingURI = consts.No_Painting;
else
paintingURI = posts[i].painting_uri;
let postBody;
if(posts[i].body === undefined)
postBody = 'No text';
else
postBody = posts[i].body;
userPosts += '<tr id="' + posts[i].id + '">' + '<td><a href="/posts/' + posts[i].id + '">' + postBody + '</a></td>' +
'<td>' + posts[i].empathy_count + '</td>' +
'<td><img src="' + paintingURI + '" width=auto height=auto></td>';
}
let body =
'<style>\n' +
' table,th,td {\n' +
' border : 1px solid black;\n' +
' border-collapse: collapse;\n' +
' }\n' +
' th,td {\n' +
' padding: 5px;\n' +
' }\n' +
'</style>\n' +
'<table id="posts"><tbody><tr>' +
'<tr>' +
'<th>User Name</th>' +
'<th>Total Yeah!</th>' +
'</tr>\n<tr>' +
'<td>' + posts[0].screen_name + '</td>' +
'<td>' + totalEmpathy + '</td></tr>' +
'<th>Body Text</th>' +
'<th>Yeah Count</th>' +
'<th>Painting</th>' +
'</tr>';
body += userPosts + '</tbody></table>';
res.send('<!DOCTYPE html>'
+ '<html><head>' + '</head><body>' + body + '</body></html>');
});
});
module.exports = router;

View File

@@ -1,136 +0,0 @@
var express = require('express');
var router = express.Router();
const database = require('../../../database');
const comPostGen = require('../../../util/CommunityPostGen');
const processHeaders = require('../../../util/authentication');
/* GET post titles. */
router.get('/', function (req, res) {
res.send(
'<!DOCTYPE html>\n' +
'<html>\n' +
'<style>\n' +
' table,th,td {\n' +
' border : 1px solid black;\n' +
' border-collapse: collapse;\n' +
' }\n' +
' th,td {\n' +
' padding: 5px;\n' +
' }\n' +
'</style>\n' +
'<body>\n' +
'<h1>Pretendo Miiverse Demo</h1>\n' +
'\n' +
'<form action="" id="communitySelection">\n' +
'</form>\n' +
'<br>\n' +
'<div id="Posts"></div>\n' +
'\n' +
'<script>\n' +
'if (typeof wiiuBrowser !== \'undefined\' && typeof wiiuBrowser.endStartUp !== \'undefined\') {\n' +
'wiiuBrowser.endStartUp();\n' +
'}\n' +
' function getCommunities() {\n' +
' var xhttp;\n' +
' xhttp = new XMLHttpRequest();\n' +
' xhttp.onreadystatechange = function() {\n' +
' if (this.readyState === 4 && this.status === 200) {\n' +
' document.getElementById("communitySelection").innerHTML = this.responseText;\n' +
' }\n' +
' };\n' +
' xhttp.open("GET", "/v1/communities/list", true);\n' +
' xhttp.send();\n' +
' }\n' +
' function getPosts(str) {\n' +
' var xhttp;\n' +
' if (str === "") {\n' +
' document.getElementById("Posts").innerHTML = "";\n' +
' return;\n' +
' }\n' +
' if (str === -1) {\n' +
' var a = document.getElementById(\'communities\');\n' +
' str = a.options[a.selectedIndex].value;' +
' console.log(str);' +
' }\n' +
' xhttp = new XMLHttpRequest();\n' +
' xhttp.onreadystatechange = function() {\n' +
' if (this.readyState === 4 && this.status === 200) {\n' +
' document.getElementById("Posts").innerHTML = this.responseText;\n' +
' }\n' +
' };\n' +
' xhttp.open("GET", "/v1/posts?community_id=" + str + "&limit=100&format=0", true);\n' +
' xhttp.send();\n' +
' }\n' +
'getCommunities()' +
'</script>\n' +
'\n' +
'</body>\n' +
'</html>\n'
)
});
router.get('/admin/communities/new', function (req, res) {
res.send(
'<!DOCTYPE html>\n' +
'<html>\n' +
'<body>\n' +
'\n' +
'<h2>New Community Form</h2>\n' +
'\n' +
'<p>Fill out all the information below. Title ID\'s must be in the decimal value form, not the hex form</p>\n' +
'\n' +
'<form action="/v1/communities/new" enctype="multipart/form-data" target="_blank" method="post">\n' +
' <label for="name">Community Name:</label><br>\n' +
' <input type="text" id="name" name="name"><br>\n' +
' \n' +
' <label for="description">Description:</label><br>\n' +
' <input type="text" id="description" name="description"><br>\n' +
' \n' +
' <label for="title_ids">Title ID 1:</label><br>\n' +
' <input type="text" id="title_ids" name="title_ids[]"><br>\n' +
' \n' +
' <label for="title_ids">Title ID 2:</label><br>\n' +
' <input type="text" id="title_ids" name="title_ids[]"><br>\n' +
' \n' +
' <label for="title_ids">Title ID 3:</label><br>\n' +
' <input type="text" id="title_ids" name="title_ids[]"><br>\n' +
' \n' +
' <label for="icon">System Icon (B64 TGA):</label><br>\n' +
' <input type="text" id="icon" name="icon"><br>\n' +
' \n' +
'Browser Icon<br>\n' +
'<input type="file" id="browserIcon" accept="image/png" name="browserIcon"><br>\n' +
' \n' +
'3DS Browser Banner<br>\n' +
'<input type="file" id="CTRbrowserHeader" accept="image/png" name="CTRbrowserHeader"><br>\n' +
'Wii U Browser Banner<br>\n' +
'<input type="file" id="WiiUbrowserHeader" accept="image/png" name="WiiUbrowserHeader"><br>\n' +
' Is Recommended?\n' +
' <input type="radio" id="isRecomended" name="is_recommended" value="1">\n' +
' <label for="isRecomended">True</label>\n' +
' <input type="radio" id="isNotRecomended" name="is_recommended" value="0">\n' +
' <label for="isNotRecomended">False</label><br>\n' +
' \n' +
' Has Shop Page? \n' +
' <input type="radio" id="hasShopPage" name="has_shop_page" value="1">\n' +
' <label for="hasShopPage">True</label>\n' +
' <input type="radio" id="noShopPage" name="has_shop_page" value="0">\n' +
' <label for="noShopPage">False</label><br>\n' +
' \n' +
' Platform \n' +
' <input type="radio" id="WiiU" name="platform_ID" value="0">\n' +
' <label for="platform_ID">Wii U</label>\n' +
' <input type="radio" id="3DS" name="platform_ID" value="1">\n' +
' <label for="platform_ID">3DS</label>\n' +
' <input type="radio" id="Both" name="platform_ID" value="2">\n' +
' <label for="platform_ID">Both</label><br>\n' +
' \n' +
' <input type="submit" value="Submit">\n' +
'</form>\n' +
'\n' +
'</body>\n' +
'</html>\n'
)
});
module.exports = router;

View File

@@ -2,7 +2,50 @@ const crypto = require('crypto');
const NodeRSA = require('node-rsa');
const fs = require('fs-extra');
const config = require('./config.json');
let B64token = 'C9EFfkLjs6/81whPNBXOEqDPGQiDykCDwS/B4KcQDcAJxyvnXEure4xfwS/GPQKbRqLoE/QCTPEHh2q9B6TgdWJYNvnNb3wpvwhHy5CJ0hqwYxVaKE0iZcxQVK7QyJlhya3sE3K0HTmP1DqVISxYkEyCF7ofSZMoRcbKUvxfYHbALnh+Hbdl5F3nEUIcmBPijsVzi8kJSe2aQYR8n1X3b0J0HFO5QzHAwMiwiZBOyHnIdHtpsoWalDDkjoQfufSP8LcNFA==';
const util = require('./util/authentication');
const database = require('./database');
let b = "eJzt222u2zYQhWG3v7KMLKXL6u5bGMFtb11JnI8z1FB8H6A/GosjkiKPaAd5vX5/ffnjtz9fP3/8" +
"BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0uv1+uc/" +
"ANjF9+w7+g8AnmiUfWQggCc6yzcyEOiN/ZnjmTfmGNBQZBbf1XK8c8XcAnmqvOL3qhxV/jHXgJ0y" +
"s47akYE2ivzzzjXPA7tTZpblt3scU8z3ar8f3n1/rE2xhpWZdZabHfZad4r5Xun3Q74XIEP5O1tl" +
"BrLObWbmn+f6qucX7UNHnfv2RKOM8T6Lq+9R2XpkoE3H/Kt+fpa6mfNtNdb2PUbfMTtkFvnno3xu" +
"3jbWuupnaKmbHd/RZ94+Wvv+xPXdcTzW9ZKpW7Xeceyu/PN+br2P5fOK/Lu6NnKGHNU5O4N4dM3N" +
"rpnuWTPR2t//H3NEntvs/FN8ftbvWee/bJ2K+t1ypnPf3hRrEL2skn+ja7z178q/Ua1RnUi7s350" +
"26/VfcqO+2r+Os7nl2796USRf4r7ZPIhWtvy54rcyo7PIlq/056dnX2Ktb9C9nXv451Wzz/vucdb" +
"ryL/on0d8fRVdU8lxdgttbPZVZ0pqlrKMT+ZOsuurs/mw9G1lfk3am+9Jjo+jxnZWU2RRZ6a3fJA" +
"2Q9r/t095g48c1GRf5nrVLl0dn1F/mVqXVk9A6Pr8Gp+lWuvkroPK+V+B1X7U332UWeJev9E7uHt" +
"85Vo+w57IbJOzp6V+hlWq8gk77rc2eh9Gnk+kXbKtarIP0udO3K7W1uFineNta7nugrRPWatab3v" +
"zjrk31E762dXdbz99NRR5ay331/XZtor2imp5iay9u6ct8w+y/aLDPy/bP5F38Fn9z/rk6cPmWuv" +
"Pvfmn6Le1XWRtdxl/avfDZ41k523zPxl17q1ruW6Duugo2z2ZDOwMv++ro/WUr4PvHs1m3+d1r0y" +
"p+7Kv04ZuPJa6GZG/o3yoCr7Rirew9H8Gs1HJD+7rPeq/LO0U+ZfZD4t64EMvE9l/o1qZ56hQkX+" +
"nf25Zx4ye7zjOle+3zxzo8qszLxm9kem9uj6LmvjbpE5HNWo2osVz06RgaO6kfdApG3Xta3Kv7Mx" +
"et5D0f6Sgc+kmIurvd45+z7rVteuzr+uPH20ZJn184pMidS2XK/Mak+bzutmBtU8VJ9Bqmpb6irf" +
"DZbrFG07yZ5RrGtrRv4d3UdR03qNqh0Z+ItyDqrnsqq+da1Xy5xhOq9lxf601lDs64qsivRf2d+K" +
"tk+w+/hHZs9P5vzS4Vke3Vtxrpk5poqsqsy/O9o9AWdgm9lzozq7dMmNFdeY+gw44yy/6jvzLuTf" +
"M92VgVffWUd96bb+1Oe1qu/L2TaZdqsj/57rrudqzUBPNs7W5Vw3IzMVbVfUde1hfStn31tV7sw4" +
"03EGtOu6/vAsn2usc/a9rZx/M9s8wa7jxjyrrbGq/JiZS2Sg3W7jxVwr7qsuZ8CZv+mt+JyAzjp/" +
"z73SJf+ibSLtVnxOQHcr7qsn5J+37YrPCVjBanuq8uw0+1xWmc0Anqc6ozpk4OdvE2QfgC+dznSK" +
"fDrLO7IPwKdo/nX4zmztJ9kH4Eh1Pt3197PkHQCL6r874O9nAXQ1M/+u2pJ9AGabkU+j3+L4nQ7A" +
"XWadz/j7WQDdjDJImU9kH4BujrKoMqPIPQCd8N0UwM7IvnXwXAA9Mq8/3k0AdkYGAtgV+QdgV+Qf" +
"gJ2RgQB2tWL+zerr9/usNkcAxlbLv8r+Wv595SrzBMBGtbezOTHKm8ocUmWf5d+CXrXtoEs/gFmy" +
"uZI9K1lyZ3b2ff8s0/+ja67a36lLP4CZKs5tnnrW85d6byrqevveNf/4nj8H89tPdN0rvqtac6E6" +
"/7LtP2t4+u7pR+XeqZxj67UVde82852e1bFP1RT5F63pyYbO+Xf12egekesqqOt7s390nafuZ5vZ" +
"LJnXLQM79mmWyJhXzj9Fzar8s8xFhco5Hn1+Nf7PP+/wrrgyGteMnIncY9fs++Ide3a/qjIyQlXT" +
"smd3zb+rmpZsGP2/Yt1Vv1e75W/Xd0YHK+RfxTqtqhMd3yr5F313WefMko/eMUSzweruZzQa353r" +
"qztl/inne8f8y9SL8tS3PhNV/nnbWvq8SvZZ++wd/6z+ryKTf5F1VbHfrKpqRfYW+Xde1zoPnr1f" +
"peIenrUVWW8zxrASdQaq7tU5/z7rRfraIf+894jknyenrPOwU/Zd3VPx7HbOP+XeVe2fyLUWd6xX" +
"T7u71mZ1/o3aefMv2ge16vVkvcbaD/Lvv6IZlmn/tPxT9OVqDrvt40z2WPNtVFO9zjLuWKOR/MvM" +
"/VNF3yNnNaztvPWVOj3rq6zLvJei/VDkSnSfefPPM6ZK5N+6FPm3mu5jnJ19Z/e0XDe6xvN5Zf5V" +
"zucd+Xd0nWVeyb9/Rdfh6mbmSsbs/kXyL7p2Rtk02qNV94iorum5p2XM5N8vO8/HKhk4UzSDRucP" +
"670i2dsxA1Us75jRZ0f5OKv/nXnW2lNV7YVVjebDet6I3s9z/Vl/PPdQPveqNZQ9y1n7s9se8K6d" +
"p1KcZZ7gavye88bMPlrvf3UW6n4G/KxbOd+7rPnMO/eJIu/Yp4nm3/dr7+jnUV9H7Sqf76wMrLDD" +
"eudcfG3X/Hsbne06zIP1HOrJwar+jd4Z3XR6zlXIv7HPM9DOuo0/+l3XU0PZx5W+V3Ttl0pkfJ2f" +
"F/ZjWYtd1utK2ffWuW8K0fE9eU6wFusa7rZeu2ffW/f+ZT19fNgD67fGDvnw5LEByCEfAAAAAAAA" +
"AAAA5vgbwDsbNA==";
console.log(util.data.processServiceToken('Lg8Ix5uzYLZ01ip/P3UMt4iEPVjJYjh41L5r+hndp30gzEGxgvx830MWvH7jhiNBIvJbCAwHSEKJF2RvHYL+xq3oCVON8e1yy/eZlWKKW3SOvVMRiXlEr66zPMqZSIIxtYLvn1+7MM3qJPIuTIzR/4/JGeAE6KxPJuFK7zkROEYu9LSfPKGY0O2Sv6rnrZze3NHwHtT70uI7FXbP0P3t8yVQLgtAbxktcS5+NeGSwpVwpnO54rMMZjgJ7l42VKPGhEzHBw=='));
/*let B64token = 'C9EFfkLjs6/81whPNBXOEqDPGQiDykCDwS/B4KcQDcAJxyvnXEure4xfwS/GPQKbRqLoE/QCTPEHh2q9B6TgdWJYNvnNb3wpvwhHy5CJ0hqwYxVaKE0iZcxQVK7QyJlhya3sE3K0HTmP1DqVISxYkEyCF7ofSZMoRcbKUvxfYHbALnh+Hbdl5F3nEUIcmBPijsVzi8kJSe2aQYR8n1X3b0J0HFO5QzHAwMiwiZBOyHnIdHtpsoWalDDkjoQfufSP8LcNFA==';
let token = Buffer.from(B64token, 'base64');
console.log(B64token);
console.log(config.secret);
@@ -45,3 +88,8 @@ if (!calculatedSignature.equals(signature)) {
console.log('Token signature did not match');
console.log("fuck");
}
*/
database.connect().then(async e => {
console.log('running');
console.log(await util.data.processUser(1566682802));
});

View File

@@ -107,6 +107,48 @@ class CommunityPostGen {
return xml.end({ pretty: true, allowEmpty: true });
}
static async Communities(community) {
const xml = xmlbuilder.create("result")
.e("has_error", "0").up()
.e("version", "1").up()
.e("request_name", "communities").up()
.e("communities")
.e("community")
.e('olive_community_id', community.community_id).up()
.e('community_id', community.community_id).up()
.e("name", community.name).up()
.e("description", community.description).up()
.e("icon").up()
.e("icon_3ds").up()
.e("pid").up()
.e("app_data").up()
.e("is_user_community", 0).up()
.up()
.e("community")
.e('olive_community_id', community.community_id + 100).up()
.e('community_id', community.community_id + 100).up()
.e("name", community.name + '- Nintendo Levels').up()
.e("description", community.description).up()
.e("icon").up()
.e("icon_3ds").up()
.e("pid").up()
.e("app_data", 'TVZNSQI').up()
.e("is_user_community", 0).up()
.up()
.e("community")
.e('olive_community_id', community.community_id + 200).up()
.e('community_id', community.community_id + 200).up()
.e("name", community.name + '- User Levels').up()
.e("description", community.description).up()
.e("icon").up()
.e("icon_3ds").up()
.e("pid").up()
.e("app_data", 'TVZNSQE').up()
.e("is_user_community", 0).up()
.up()
.up();
return xml.end({ pretty: true, allowEmpty: true });
}
/* TODO Again, some constants */
static async SinglePostResponse(post) {
let xml = xmlbuilder.create("result")

View File

@@ -14,14 +14,17 @@ let PNG = require('pngjs').PNG;
let methods = {
processUser: function(pid) {
return new Promise(function(resolve, reject) {
console.log('running me');
database.connect().then(async yeet => {
let userObject = await database.getUserByPID(pid);
console.log(userObject);
if(userObject != null)
resolve(userObject);
else
{
console.log('else');
await request({
url: "http://account.jemverse.xyz/v1/api/miis?pids=" + pid,
url: "http://" + config.account_server + "/v1/api/miis?pids=" + pid,
headers: {
'X-Nintendo-Client-ID': 'a2efa818a34fa16b8afbc8a74eba3eda',
'X-Nintendo-Client-Secret': 'c91cdb5658bd4954ade78533a339cf9a'
@@ -38,12 +41,17 @@ let methods = {
official: false
};
const newUsrObj = new USER(newUsr);
console.log(newUsrObj);
newUsrObj.save();
resolve(newUsr);
}
else
{
console.log('fail');
reject();
})
}
});
}
@@ -67,8 +75,7 @@ let methods = {
{
let B64token = Buffer.from(token, 'base64');
let decryptedToken = this.decryptToken(B64token);
let pid = decryptedToken.readUInt32LE(0x2);
return pid;
return decryptedToken.readUInt32LE(0x2);
}
catch(e)
{