Converted classes scripts
parent
df8b77fa4e
commit
c6bf753f29
|
@ -1,22 +1,35 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// Modules from file
|
// Modules from file
|
||||||
const { getF95Token } = require("../network-helper.js");
|
import { getF95Token } from "../network-helper.js";
|
||||||
|
|
||||||
class Credentials {
|
/**
|
||||||
constructor(username, password) {
|
* Represents the credentials used to access the platform.
|
||||||
|
*/
|
||||||
|
export class Credentials {
|
||||||
|
/**
|
||||||
|
* Username
|
||||||
|
*/
|
||||||
|
username: string;
|
||||||
|
/**
|
||||||
|
* Password of the user.
|
||||||
|
*/
|
||||||
|
password: string;
|
||||||
|
/**
|
||||||
|
* One time token used during login.
|
||||||
|
*/
|
||||||
|
token: string = null;
|
||||||
|
|
||||||
|
constructor(username: string, password: string) {
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
this.token = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
* Fetch and save the token used to log in to F95Zone.
|
* Fetch and save the token used to log in to F95Zone.
|
||||||
*/
|
*/
|
||||||
async fetchToken() {
|
async fetchToken(): Promise<void> {
|
||||||
this.token = await getF95Token();
|
this.token = await getF95Token();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Credentials;
|
|
|
@ -1,97 +1,82 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
class GameInfo {
|
/**
|
||||||
constructor() {
|
* Information of a game/mod on the platform.
|
||||||
//#region Properties
|
*/
|
||||||
/**
|
export class GameInfo {
|
||||||
* Unique ID of the game on the platform.
|
//#region Properties
|
||||||
* @type Number
|
/**
|
||||||
*/
|
* Unique ID of the game on the platform.
|
||||||
this.id = -1;
|
*/
|
||||||
/**
|
id = -1;
|
||||||
* Game name
|
/**
|
||||||
* @type String
|
* Game name
|
||||||
*/
|
*/
|
||||||
this.name = null;
|
name: string = null;
|
||||||
/**
|
/**
|
||||||
* Game author
|
* Game author
|
||||||
* @type String
|
*/
|
||||||
*/
|
author: string = null;
|
||||||
this.author = null;
|
/**
|
||||||
/**
|
* URL to the game's official conversation on the F95Zone portal
|
||||||
* URL to the game's official conversation on the F95Zone portal
|
*/
|
||||||
* @type String
|
url: string = null;
|
||||||
*/
|
/**
|
||||||
this.url = null;
|
* Game description
|
||||||
/**
|
*/
|
||||||
* Game description
|
overview: string = null;
|
||||||
* @type String
|
/**
|
||||||
*/
|
* Game language
|
||||||
this.overview = null;
|
*/
|
||||||
/**
|
language: string = null;
|
||||||
* Game language.
|
/**
|
||||||
* @type String
|
* List of supported OS
|
||||||
*/
|
*/
|
||||||
this.language = null;
|
supportedOS: string[] = [];
|
||||||
/**
|
/**
|
||||||
* List of supported OS.
|
* Specify whether the game has censorship
|
||||||
* @type
|
* measures regarding NSFW scenes
|
||||||
*/
|
*/
|
||||||
this.supportedOS = [];
|
censored: boolean = null;
|
||||||
/**
|
/**
|
||||||
* Specify whether the game has censorship
|
* List of tags associated with the game
|
||||||
* measures regarding NSFW scenes.
|
*/
|
||||||
* @type Boolean
|
tags: string[] = [];
|
||||||
*/
|
/**
|
||||||
this.censored = null;
|
* Graphics engine used for game development
|
||||||
/**
|
*/
|
||||||
* List of tags associated with the game
|
engine: string = null;
|
||||||
* @type String[]
|
/**
|
||||||
*/
|
* Development of the game
|
||||||
this.tags = [];
|
*/
|
||||||
/**
|
status: string = null;
|
||||||
* Graphics engine used for game development
|
/**
|
||||||
* @type String
|
* Game description image URL
|
||||||
*/
|
*/
|
||||||
this.engine = null;
|
previewSrc: string = null;
|
||||||
/**
|
/**
|
||||||
* Development of the game
|
* Game version
|
||||||
* @type String
|
*/
|
||||||
*/
|
version: string = null;
|
||||||
this.status = null;
|
/**
|
||||||
/**
|
* Last time the game underwent updates
|
||||||
* Game description image URL
|
*/
|
||||||
* @type String
|
lastUpdate: Date = null;
|
||||||
*/
|
/**
|
||||||
this.previewSrc = null;
|
* Specifies if the game is original or a mod
|
||||||
/**
|
*/
|
||||||
* Game version
|
isMod = false;
|
||||||
* @type String
|
/**
|
||||||
*/
|
* Changelog for the last version
|
||||||
this.version = null;
|
*/
|
||||||
/**
|
changelog: string = null;
|
||||||
* Last time the game underwent updates
|
//#endregion Properties
|
||||||
* @type Date
|
|
||||||
*/
|
|
||||||
this.lastUpdate = null;
|
|
||||||
/**
|
|
||||||
* Specifies if the game is original or a mod
|
|
||||||
* @type Boolean
|
|
||||||
*/
|
|
||||||
this.isMod = false;
|
|
||||||
/**
|
|
||||||
* Changelog for the last version.
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
this.changelog = null;
|
|
||||||
//#endregion Properties
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts the object to a dictionary used for JSON serialization.
|
* Converts the object to a dictionary used for JSON serialization.
|
||||||
*/
|
*/
|
||||||
/* istanbul ignore next */
|
/* istanbul ignore next */
|
||||||
toJSON() {
|
toJSON(): Record<string, unknown> {
|
||||||
return {
|
return {
|
||||||
id: this.id,
|
id: this.id,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
|
@ -117,13 +102,12 @@ class GameInfo {
|
||||||
* @param {String} json JSON string used to create the new object
|
* @param {String} json JSON string used to create the new object
|
||||||
* @returns {GameInfo}
|
* @returns {GameInfo}
|
||||||
*/
|
*/
|
||||||
static fromJSON(json) {
|
static fromJSON(json: string): GameInfo {
|
||||||
// Convert string
|
// Convert string
|
||||||
const temp = Object.assign(new GameInfo(), JSON.parse(json));
|
const temp = Object.assign(new GameInfo(), JSON.parse(json));
|
||||||
|
|
||||||
// JSON cannot transform a string to a date implicitly
|
// JSON cannot transform a string to a date implicitly
|
||||||
temp.lastUpdate = new Date(temp.lastUpdate);
|
temp.lastUpdate = new Date(temp.lastUpdate);
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
module.exports = GameInfo;
|
|
||||||
|
|
|
@ -3,18 +3,18 @@
|
||||||
/**
|
/**
|
||||||
* Object obtained in response to an attempt to login to the portal.
|
* Object obtained in response to an attempt to login to the portal.
|
||||||
*/
|
*/
|
||||||
class LoginResult {
|
export class LoginResult {
|
||||||
constructor(success, message) {
|
/**
|
||||||
/**
|
* Result of the login operation
|
||||||
* Result of the login operation
|
*/
|
||||||
* @type Boolean
|
success: boolean;
|
||||||
*/
|
/**
|
||||||
|
* Login response message
|
||||||
|
*/
|
||||||
|
message: string;
|
||||||
|
|
||||||
|
constructor(success: boolean, message: string) {
|
||||||
this.success = success;
|
this.success = success;
|
||||||
/**
|
|
||||||
* Login response message
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
module.exports = LoginResult;
|
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// Modules from file
|
// Modules from file
|
||||||
const shared = require("../shared.js");
|
import shared = require("../shared.js");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert prefixes and platform tags from string to ID and vice versa.
|
* Convert prefixes and platform tags from string to ID and vice versa.
|
||||||
*/
|
*/
|
||||||
class PrefixParser {
|
export class PrefixParser {
|
||||||
constructor() {
|
|
||||||
}
|
|
||||||
|
|
||||||
//#region Private methods
|
//#region Private methods
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
|
@ -18,23 +15,19 @@ class PrefixParser {
|
||||||
* @param {Any} value Value associated with the key
|
* @param {Any} value Value associated with the key
|
||||||
* @returns {String|undefined} Key found or undefined
|
* @returns {String|undefined} Key found or undefined
|
||||||
*/
|
*/
|
||||||
_getKeyByValue(object, value) {
|
_getKeyByValue(object: { [x: string]: unknown; }, value: unknown): string | undefined {
|
||||||
return Object.keys(object).find(key => object[key] === value);
|
return Object.keys(object).find(key => object[key] === value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* Makes an array of strings uppercase.
|
* Makes an array of strings uppercase.
|
||||||
* @param {String[]} a
|
|
||||||
* @returns {String[]}
|
|
||||||
*/
|
*/
|
||||||
_toUpperCaseArray(a) {
|
_toUpperCaseArray(a: string[]): string[] {
|
||||||
/**
|
/**
|
||||||
* Makes a string uppercase.
|
* Makes a string uppercase.
|
||||||
* @param {String} s
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
*/
|
||||||
function toUpper(s) {
|
function toUpper(s: string): string {
|
||||||
return s.toUpperCase();
|
return s.toUpperCase();
|
||||||
}
|
}
|
||||||
return a.map(toUpper);
|
return a.map(toUpper);
|
||||||
|
@ -43,10 +36,8 @@ class PrefixParser {
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* Check if `dict` contains `value` as a value.
|
* Check if `dict` contains `value` as a value.
|
||||||
* @param {Object.<number, string>} dict
|
|
||||||
* @param {String} value
|
|
||||||
*/
|
*/
|
||||||
_valueInDict(dict, value) {
|
_valueInDict(dict: { [s: number]: string; }, value: string): boolean {
|
||||||
const array = Object.values(dict);
|
const array = Object.values(dict);
|
||||||
const upperArr = this._toUpperCaseArray(array);
|
const upperArr = this._toUpperCaseArray(array);
|
||||||
const element = value.toUpperCase();
|
const element = value.toUpperCase();
|
||||||
|
@ -57,10 +48,9 @@ class PrefixParser {
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
* Convert a list of prefixes to their respective IDs.
|
* Convert a list of prefixes to their respective IDs.
|
||||||
* @param {String[]} prefixes
|
|
||||||
*/
|
*/
|
||||||
prefixesToIDs(prefixes) {
|
prefixesToIDs(prefixes: string[]) : number[] {
|
||||||
const ids = [];
|
const ids: number[] = [];
|
||||||
for(const p of prefixes) {
|
for(const p of prefixes) {
|
||||||
// Check what dict contains the value
|
// Check what dict contains the value
|
||||||
let dict = null;
|
let dict = null;
|
||||||
|
@ -80,10 +70,9 @@ class PrefixParser {
|
||||||
/**
|
/**
|
||||||
* @public
|
* @public
|
||||||
* It converts a list of IDs into their respective prefixes.
|
* It converts a list of IDs into their respective prefixes.
|
||||||
* @param {number[]} ids
|
|
||||||
*/
|
*/
|
||||||
idsToPrefixes(ids) {
|
idsToPrefixes(ids: number[]): string[] {
|
||||||
const prefixes = [];
|
const prefixes:string[] = [];
|
||||||
for(const id of ids) {
|
for(const id of ids) {
|
||||||
// Check what dict contains the key
|
// Check what dict contains the key
|
||||||
let dict = null;
|
let dict = null;
|
||||||
|
@ -98,6 +87,4 @@ class PrefixParser {
|
||||||
}
|
}
|
||||||
return prefixes;
|
return prefixes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = PrefixParser;
|
|
|
@ -1,53 +1,53 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// Core modules
|
// Core modules
|
||||||
const fs = require("fs");
|
import * as fs from "fs";
|
||||||
const promisify = require("util").promisify;
|
import { promisify } from "util";
|
||||||
|
|
||||||
// Public modules from npm
|
// Public modules from npm
|
||||||
const md5 = require("md5");
|
import * as md5 from "md5";
|
||||||
|
|
||||||
// Promisifed functions
|
// Promisifed functions
|
||||||
const areadfile = promisify(fs.readFile);
|
const areadfile = promisify(fs.readFile);
|
||||||
const awritefile = promisify(fs.writeFile);
|
const awritefile = promisify(fs.writeFile);
|
||||||
const aunlinkfile = promisify(fs.unlink);
|
const aunlinkfile = promisify(fs.unlink);
|
||||||
|
|
||||||
class Session {
|
export class Session {
|
||||||
constructor(path) {
|
//#region Properties
|
||||||
/**
|
/**
|
||||||
* Max number of days the session is valid.
|
* Max number of days the session is valid.
|
||||||
*/
|
*/
|
||||||
this.SESSION_TIME = 1;
|
private readonly SESSION_TIME: number = 1;
|
||||||
|
/**
|
||||||
|
* Path of the session map file on disk.
|
||||||
|
*/
|
||||||
|
private path: string = null;
|
||||||
|
/**
|
||||||
|
* Indicates if the session is mapped on disk.
|
||||||
|
*/
|
||||||
|
private isMapped = null;
|
||||||
|
/**
|
||||||
|
* Date of creation of the session.
|
||||||
|
*/
|
||||||
|
private created = null;
|
||||||
|
/**
|
||||||
|
* MD5 hash of the username and the password.
|
||||||
|
*/
|
||||||
|
private hash = null;
|
||||||
|
//#endregion Properties
|
||||||
|
|
||||||
/**
|
constructor(path: string) {
|
||||||
* Path of the session map file on disk.
|
this.path = path;
|
||||||
*/
|
this.isMapped = fs.existsSync(this.path);
|
||||||
this._path = path;
|
this.created = new Date(Date.now());
|
||||||
|
this.hash = null;
|
||||||
/**
|
|
||||||
* Indicates if the session is mapped on disk.
|
|
||||||
*/
|
|
||||||
this._isMapped = fs.existsSync(this._path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Date of creation of the session.
|
|
||||||
*/
|
|
||||||
this._created = new Date(Date.now());
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MD5 hash of the username and the password.
|
|
||||||
*/
|
|
||||||
this._hash = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//#region Private Methods
|
//#region Private Methods
|
||||||
/**
|
/**
|
||||||
* @private
|
|
||||||
* Get the difference in days between two dates.
|
* Get the difference in days between two dates.
|
||||||
* @param {Date} a
|
|
||||||
* @param {Date} b
|
|
||||||
*/
|
*/
|
||||||
_dateDiffInDays(a, b) {
|
private dateDiffInDays(a: Date, b: Date) {
|
||||||
const MS_PER_DAY = 1000 * 60 * 60 * 24;
|
const MS_PER_DAY = 1000 * 60 * 60 * 24;
|
||||||
|
|
||||||
// Discard the time and time-zone information.
|
// Discard the time and time-zone information.
|
||||||
|
@ -58,72 +58,70 @@ class Session {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
|
||||||
* Convert the object to a dictionary serializable in JSON.
|
* Convert the object to a dictionary serializable in JSON.
|
||||||
*/
|
*/
|
||||||
_toJSON() {
|
private toJSON(): Record<string, unknown> {
|
||||||
return {
|
return {
|
||||||
created: this._created,
|
created: this.created,
|
||||||
hash: this._hash,
|
hash: this.hash,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
//#endregion Private Methods
|
//#endregion Private Methods
|
||||||
|
|
||||||
//#region Public Methods
|
//#region Public Methods
|
||||||
create(username, password) {
|
/**
|
||||||
|
* Create a new session
|
||||||
|
*/
|
||||||
|
create(username: string, password: string):void {
|
||||||
// First, create the hash of the credentials
|
// First, create the hash of the credentials
|
||||||
const value = `${username}%%%${password}`;
|
const value = `${username}%%%${password}`;
|
||||||
this._hash = md5(value);
|
this.hash = md5(value);
|
||||||
|
|
||||||
// Update the creation date
|
// Update the creation date
|
||||||
this._created = new Date(Date.now());
|
this.created = new Date(Date.now());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
|
||||||
* Save the session to disk.
|
* Save the session to disk.
|
||||||
*/
|
*/
|
||||||
async save() {
|
async save() : Promise<void> {
|
||||||
// Update the creation date
|
// Update the creation date
|
||||||
this._created = new Date(Date.now());
|
this.created = new Date(Date.now());
|
||||||
|
|
||||||
// Convert data
|
// Convert data
|
||||||
const json = this._toJSON();
|
const json = this.toJSON();
|
||||||
const data = JSON.stringify(json);
|
const data = JSON.stringify(json);
|
||||||
|
|
||||||
// Write data
|
// Write data
|
||||||
await awritefile(this._path, data);
|
await awritefile(this.path, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
|
||||||
* Load the session from disk.
|
* Load the session from disk.
|
||||||
*/
|
*/
|
||||||
async load() {
|
async load(): Promise<void> {
|
||||||
// Read data
|
// Read data
|
||||||
const data = await areadfile(this._path);
|
const data = await areadfile(this.path, { encoding: 'utf-8', flag: 'r' });
|
||||||
const json = JSON.parse(data);
|
const json = JSON.parse(data);
|
||||||
|
|
||||||
// Assign values
|
// Assign values
|
||||||
this._created = json.created;
|
this.created = json.created;
|
||||||
this._hash = json.hash;
|
this.hash = json.hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
|
||||||
* Delete the session from disk.
|
* Delete the session from disk.
|
||||||
*/
|
*/
|
||||||
async delete() {
|
async delete(): Promise<void> {
|
||||||
await aunlinkfile(this._path);
|
await aunlinkfile(this.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @public
|
|
||||||
* Check if the session is valid.
|
* Check if the session is valid.
|
||||||
*/
|
*/
|
||||||
isValid(username, password) {
|
isValid(username:string, password:string) : boolean {
|
||||||
// Get the number of days from the file creation
|
// Get the number of days from the file creation
|
||||||
const diff = this._dateDiffInDays(new Date(Date.now()), this._created);
|
const diff = this.dateDiffInDays(new Date(Date.now()), this.created);
|
||||||
|
|
||||||
// The session is valid if the number of days is minor than SESSION_TIME
|
// The session is valid if the number of days is minor than SESSION_TIME
|
||||||
let valid = diff < this.SESSION_TIME;
|
let valid = diff < this.SESSION_TIME;
|
||||||
|
@ -131,11 +129,9 @@ class Session {
|
||||||
if(valid) {
|
if(valid) {
|
||||||
// Check the hash
|
// Check the hash
|
||||||
const value = `${username}%%%${password}`;
|
const value = `${username}%%%${password}`;
|
||||||
valid = md5(value) === this._hash;
|
valid = md5(value) === this.hash;
|
||||||
}
|
}
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
//#endregion Public Methods
|
//#endregion Public Methods
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Session;
|
|
|
@ -3,24 +3,17 @@
|
||||||
/**
|
/**
|
||||||
* Class containing the data of the user currently connected to the F95Zone platform.
|
* Class containing the data of the user currently connected to the F95Zone platform.
|
||||||
*/
|
*/
|
||||||
class UserData {
|
export class UserData {
|
||||||
constructor() {
|
/**
|
||||||
/**
|
* User name.
|
||||||
* User name.
|
*/
|
||||||
* @type String
|
username: string = null;
|
||||||
*/
|
/**
|
||||||
this.username = "";
|
* Path to the user's profile picture.
|
||||||
/**
|
*/
|
||||||
* Path to the user's profile picture.
|
avatarSrc: string = null;
|
||||||
* @type String
|
/**
|
||||||
*/
|
* List of followed game thread URLs.
|
||||||
this.avatarSrc = null;
|
*/
|
||||||
/**
|
watchedGameThreads: string[] = [];
|
||||||
* List of followed game thread URLs.
|
|
||||||
* @type String[]
|
|
||||||
*/
|
|
||||||
this.watchedGameThreads = [];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = UserData;
|
|
||||||
|
|
Loading…
Reference in New Issue