mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-09 06:43:24 +00:00
Compare commits
7 Commits
v2.9.16
...
feature/ne
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0887429665 | ||
|
|
d51009c823 | ||
|
|
61f7d376d2 | ||
|
|
e4e5b1327b | ||
|
|
bf657a0945 | ||
|
|
32498bb8a7 | ||
|
|
8e2988edf0 |
@@ -505,7 +505,7 @@ export default class Header extends TranslatedComponent {
|
|||||||
return (
|
return (
|
||||||
<header>
|
<header>
|
||||||
{this.props.appCacheUpdate && <div id="app-update" onClick={() => window.location.reload() }>{translate('PHRASE_UPDATE_RDY')}</div>}
|
{this.props.appCacheUpdate && <div id="app-update" onClick={() => window.location.reload() }>{translate('PHRASE_UPDATE_RDY')}</div>}
|
||||||
{this.props.appCache ? <a className={'view-changes'} href={'https://github.com/EDCD/coriolis/compare/edcd:develop@{' + window.CORIOLIS_DATE + '}...edcd:develop'} target="_blank">
|
{this.props.appCacheUpdate ? <a className={'view-changes'} href={'https://github.com/EDCD/coriolis/compare/edcd:develop@{' + window.CORIOLIS_DATE + '}...edcd:develop'} target="_blank">
|
||||||
{'View Release Changes'}
|
{'View Release Changes'}
|
||||||
</a> : null}
|
</a> : null}
|
||||||
<Link className='l' href='/' style={{ marginRight: '1em' }} title='Home'><CoriolisLogo className='icon xl' /></Link>
|
<Link className='l' href='/' style={{ marginRight: '1em' }} title='Home'><CoriolisLogo className='icon xl' /></Link>
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ export default class ModalPermalink extends TranslatedComponent {
|
|||||||
<h3 >{translate('shortened')}</h3>
|
<h3 >{translate('shortened')}</h3>
|
||||||
<input value={this.state.shortenedUrl} readOnly size={25} onFocus={ (e) => e.target.select() }/>
|
<input value={this.state.shortenedUrl} readOnly size={25} onFocus={ (e) => e.target.select() }/>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
|
<p>s.orbis.zone is the new URL shortener domain, old eddp.co urls are considered end of life and could go down at any moment. Sorry for any inconvenience.</p>
|
||||||
<button className={'r dismiss cap'} onClick={this.context.hideModal}>{translate('close')}</button>
|
<button className={'r dismiss cap'} onClick={this.context.hideModal}>{translate('close')}</button>
|
||||||
</div>;
|
</div>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import React from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import TranslatedComponent from './TranslatedComponent';
|
import TranslatedComponent from './TranslatedComponent';
|
||||||
import ShortenUrl from '../utils/ShortenUrl';
|
import ShortenUrl from '../utils/ShortenUrl';
|
||||||
|
import Persist from '../stores/Persist';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permalink modal
|
* Permalink modal
|
||||||
@@ -21,13 +22,7 @@ export default class ModalShoppingList extends TranslatedComponent {
|
|||||||
this.state = {
|
this.state = {
|
||||||
matsList: '',
|
matsList: '',
|
||||||
mats: {},
|
mats: {},
|
||||||
matsPerGrade: {
|
matsPerGrade: Persist.getRolls()
|
||||||
1: 2,
|
|
||||||
2: 2,
|
|
||||||
3: 3,
|
|
||||||
4: 4,
|
|
||||||
5: 6
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +84,7 @@ export default class ModalShoppingList extends TranslatedComponent {
|
|||||||
let newState = this.state.matsPerGrade;
|
let newState = this.state.matsPerGrade;
|
||||||
newState[grade] = parseInt(e.target.value);
|
newState[grade] = parseInt(e.target.value);
|
||||||
this.setState({ matsPerGrade: newState });
|
this.setState({ matsPerGrade: newState });
|
||||||
|
Persist.setRolls(newState);
|
||||||
this.renderMats();
|
this.renderMats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
const canBoost = ship.canBoost(cargo, ship.fuelCapacity);
|
const canBoost = ship.canBoost(cargo, ship.fuelCapacity);
|
||||||
const boostTooltip = canBoost ? 'TT_SUMMARY_BOOST' : canThrust ? 'TT_SUMMARY_BOOST_NONFUNCTIONAL' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
|
const boostTooltip = canBoost ? 'TT_SUMMARY_BOOST' : canThrust ? 'TT_SUMMARY_BOOST_NONFUNCTIONAL' : 'TT_SUMMARY_SPEED_NONFUNCTIONAL';
|
||||||
const sgMetrics = Calc.shieldMetrics(ship, pips.sys || 2);
|
const sgMetrics = Calc.shieldMetrics(ship, pips.sys || 2);
|
||||||
|
const shipBoost = canBoost ? Calc.calcBoost(ship) : 'No Boost';
|
||||||
const armourMetrics = Calc.armourMetrics(ship);
|
const armourMetrics = Calc.armourMetrics(ship);
|
||||||
let shieldColour = 'blue';
|
let shieldColour = 'blue';
|
||||||
if (shieldGenerator && shieldGenerator.m.grp === 'psg') {
|
if (shieldGenerator && shieldGenerator.m.grp === 'psg') {
|
||||||
@@ -81,6 +82,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
<th onMouseEnter={termtip.bind(null, 'hull hardness', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('hrd')}</th>
|
<th onMouseEnter={termtip.bind(null, 'hull hardness', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('hrd')}</th>
|
||||||
<th rowSpan={2}>{translate('crew')}</th>
|
<th rowSpan={2}>{translate('crew')}</th>
|
||||||
<th onMouseEnter={termtip.bind(null, 'mass lock factor', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('MLF')}</th>
|
<th onMouseEnter={termtip.bind(null, 'mass lock factor', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('MLF')}</th>
|
||||||
|
<th onMouseEnter={termtip.bind(null, 'TT_SUMMARY_BOOST_TIME', { cap: 0 })} onMouseLeave={hide} rowSpan={2}>{translate('boost time')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th className='lft'>{translate('max')}</th>
|
<th className='lft'>{translate('max')}</th>
|
||||||
@@ -117,6 +119,7 @@ export default class ShipSummaryTable extends TranslatedComponent {
|
|||||||
<td>{int(ship.hardness)}</td>
|
<td>{int(ship.hardness)}</td>
|
||||||
<td>{ship.crew}</td>
|
<td>{ship.crew}</td>
|
||||||
<td>{ship.masslock}</td>
|
<td>{ship.masslock}</td>
|
||||||
|
<td>{shipBoost !== 'No Boost' ? formats.time(shipBoost) : 'No Boost'}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -61,6 +61,7 @@
|
|||||||
"TT_SUMMARY_SPEED": "With full fuel tank and 4 pips to ENG",
|
"TT_SUMMARY_SPEED": "With full fuel tank and 4 pips to ENG",
|
||||||
"TT_SUMMARY_SPEED_NONFUNCTIONAL": "Thrusters powered off or over maximum mass with full fuel and cargo loads",
|
"TT_SUMMARY_SPEED_NONFUNCTIONAL": "Thrusters powered off or over maximum mass with full fuel and cargo loads",
|
||||||
"TT_SUMMARY_BOOST": "With full fuel tank and 4 pips to ENG",
|
"TT_SUMMARY_BOOST": "With full fuel tank and 4 pips to ENG",
|
||||||
|
"TT_SUMMARY_BOOST_TIME": "Time between each boost with 4 pips to ENG",
|
||||||
"TT_SUMMARY_BOOST_NONFUNCTIONAL": "Power distributor not able to supply enough power to boost",
|
"TT_SUMMARY_BOOST_NONFUNCTIONAL": "Power distributor not able to supply enough power to boost",
|
||||||
"TT_SUMMARY_SHIELDS": "Raw shield strength, including boosters",
|
"TT_SUMMARY_SHIELDS": "Raw shield strength, including boosters",
|
||||||
"TT_SUMMARY_SHIELDS_SCB": "Raw shield strength, including boosters and SCBs",
|
"TT_SUMMARY_SHIELDS_SCB": "Raw shield strength, including boosters and SCBs",
|
||||||
@@ -179,6 +180,7 @@
|
|||||||
"internal protection": "Internal protection",
|
"internal protection": "Internal protection",
|
||||||
"external protection": "External protection",
|
"external protection": "External protection",
|
||||||
"engagement range": "Engagement range",
|
"engagement range": "Engagement range",
|
||||||
|
"boost time": "Boost time",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"ammo": "Ammunition maximum",
|
"ammo": "Ammunition maximum",
|
||||||
"boot": "Boot time",
|
"boot": "Boot time",
|
||||||
|
|||||||
@@ -571,7 +571,11 @@ export default class OutfittingPage extends Page {
|
|||||||
* @param {String} tooltipTextKey Tooltip key
|
* @param {String} tooltipTextKey Tooltip key
|
||||||
*/
|
*/
|
||||||
function renderRequirement(className, textKey, tooltipTextKey) {
|
function renderRequirement(className, textKey, tooltipTextKey) {
|
||||||
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}><a href={textKey.startsWith('empire') ? 'http://elite-dangerous.wikia.com/wiki/Empire/Ranks' : 'http://elite-dangerous.wikia.com/wiki/Federation/Ranks'} target="_blank" rel="noopener">{translate(textKey)}</a></div>);
|
if (textKey.startsWith('empire') || textKey.startsWith('federation')) {
|
||||||
|
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}><a href={textKey.startsWith('empire') ? 'http://elite-dangerous.wikia.com/wiki/Empire/Ranks' : 'http://elite-dangerous.wikia.com/wiki/Federation/Ranks'} target="_blank" rel="noopener">{translate(textKey)}</a></div>);
|
||||||
|
} else {
|
||||||
|
requirementElements.push(<div key={textKey} className={className} onMouseEnter={termtip.bind(null, tooltipTextKey)} onMouseLeave={hide}>{translate(textKey)}</div>);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requirements) {
|
if (requirements) {
|
||||||
|
|||||||
@@ -45,10 +45,9 @@ export function totalJumpRange(mass, fsd, fuel) {
|
|||||||
* @param {number} baseShield Base Shield strength MJ for ship
|
* @param {number} baseShield Base Shield strength MJ for ship
|
||||||
* @param {object} sg The shield generator used
|
* @param {object} sg The shield generator used
|
||||||
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
|
* @param {number} multiplier Shield multiplier for ship (1 + shield boosters if any)
|
||||||
* @param {Object} ship The ship object
|
|
||||||
* @return {number} Approximate shield strengh in MJ
|
* @return {number} Approximate shield strengh in MJ
|
||||||
*/
|
*/
|
||||||
export function shieldStrength(mass, baseShield, sg, multiplier, ship) {
|
export function shieldStrength(mass, baseShield, sg, multiplier) {
|
||||||
// sg might be a module or a template; handle either here
|
// sg might be a module or a template; handle either here
|
||||||
let minMass = sg instanceof Module ? sg.getMinMass() : sg.minmass;
|
let minMass = sg instanceof Module ? sg.getMinMass() : sg.minmass;
|
||||||
let optMass = sg instanceof Module ? sg.getOptMass() : sg.optmass;
|
let optMass = sg instanceof Module ? sg.getOptMass() : sg.optmass;
|
||||||
@@ -56,17 +55,6 @@ export function shieldStrength(mass, baseShield, sg, multiplier, ship) {
|
|||||||
let minMul = sg instanceof Module ? sg.getMinMul() : sg.minmul;
|
let minMul = sg instanceof Module ? sg.getMinMul() : sg.minmul;
|
||||||
let optMul = sg instanceof Module ? sg.getOptMul() : sg.optmul;
|
let optMul = sg instanceof Module ? sg.getOptMul() : sg.optmul;
|
||||||
let maxMul = sg instanceof Module ? sg.getMaxMul() : sg.maxmul;
|
let maxMul = sg instanceof Module ? sg.getMaxMul() : sg.maxmul;
|
||||||
if (ship) {
|
|
||||||
for (const i of ship.hardpoints) {
|
|
||||||
if (!i.maxClass) {
|
|
||||||
if (i.grp === 'sb' || (i.m && i.m.grp === 'sb')) {
|
|
||||||
if (!isNaN(i.m.getModValue('optmul'))) {
|
|
||||||
optMul += i.m.getModValue('optmul') / 10000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let xnorm = Math.min(1, (maxMass - mass) / (maxMass - minMass));
|
let xnorm = Math.min(1, (maxMass - mass) / (maxMass - minMass));
|
||||||
let exponent = Math.log((optMul - minMul) / (maxMul - minMul)) / Math.log(Math.min(1, (maxMass - optMass) / (maxMass - minMass)));
|
let exponent = Math.log((optMul - minMul) / (maxMul - minMul)) / Math.log(Math.min(1, (maxMass - optMass) / (maxMass - minMass)));
|
||||||
let ynorm = Math.pow(xnorm, exponent);
|
let ynorm = Math.pow(xnorm, exponent);
|
||||||
@@ -362,7 +350,7 @@ export function shieldMetrics(ship, sys) {
|
|||||||
boosterKinDmg = boosterKinDmg > 0.7 ? boosterKinDmg : 0.7 - (0.7 - boosterKinDmg) / 2;
|
boosterKinDmg = boosterKinDmg > 0.7 ? boosterKinDmg : 0.7 - (0.7 - boosterKinDmg) / 2;
|
||||||
boosterThermDmg = boosterThermDmg > 0.7 ? boosterThermDmg : 0.7 - (0.7 - boosterThermDmg) / 2;
|
boosterThermDmg = boosterThermDmg > 0.7 ? boosterThermDmg : 0.7 - (0.7 - boosterThermDmg) / 2;
|
||||||
|
|
||||||
const generatorStrength = this.shieldStrength(ship.hullMass, ship.baseShieldStrength, shieldGenerator, 1, ship);
|
const generatorStrength = this.shieldStrength(ship.hullMass, ship.baseShieldStrength, shieldGenerator, 1);
|
||||||
const boostersStrength = generatorStrength * boost;
|
const boostersStrength = generatorStrength * boost;
|
||||||
|
|
||||||
// Recover time is the time taken to go from 0 to 50%. It includes a 16-second wait before shields start to recover
|
// Recover time is the time taken to go from 0 to 50%. It includes a 16-second wait before shields start to recover
|
||||||
@@ -464,6 +452,19 @@ export function shieldMetrics(ship, sys) {
|
|||||||
return shield;
|
return shield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate time from one boost to another
|
||||||
|
* @return {number} Boost frequency in seconds
|
||||||
|
* @param ship
|
||||||
|
*/
|
||||||
|
export function calcBoost(ship) {
|
||||||
|
if (!ship.boostEnergy || !ship.standard[4] || !ship.standard[4].m) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return ship.boostEnergy / ship.standard[4].m.engrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate armour metrics
|
* Calculate armour metrics
|
||||||
* @param {Object} ship The ship
|
* @param {Object} ship The ship
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ export default class Ship {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO Not accurate if the ship has modified shield boosters
|
// TODO Not accurate if the ship has modified shield boosters
|
||||||
return Calc.shieldStrength(this.hullMass, this.baseShieldStrength, sg, 1 + (multiplierDelta || 0), this);
|
return Calc.shieldStrength(this.hullMass, this.baseShieldStrength, sg, 1 + (multiplierDelta || 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ const LS_KEY_STATE = 'state';
|
|||||||
const LS_KEY_SIZE_RATIO = 'sizeRatio';
|
const LS_KEY_SIZE_RATIO = 'sizeRatio';
|
||||||
const LS_KEY_TOOLTIPS = 'tooltips';
|
const LS_KEY_TOOLTIPS = 'tooltips';
|
||||||
const LS_KEY_MODULE_RESISTANCES = 'moduleResistances';
|
const LS_KEY_MODULE_RESISTANCES = 'moduleResistances';
|
||||||
|
const LS_KEY_ROLLS = 'matsPerGrade';
|
||||||
|
|
||||||
let LS;
|
let LS;
|
||||||
|
|
||||||
@@ -84,6 +85,7 @@ export class Persist extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let moduleResistances = _get(LS_KEY_MODULE_RESISTANCES);
|
let moduleResistances = _get(LS_KEY_MODULE_RESISTANCES);
|
||||||
|
let matsPerGrade = _get(LS_KEY_ROLLS);
|
||||||
let tips = _get(LS_KEY_TOOLTIPS);
|
let tips = _get(LS_KEY_TOOLTIPS);
|
||||||
let insurance = _getString(LS_KEY_INSURANCE);
|
let insurance = _getString(LS_KEY_INSURANCE);
|
||||||
let shipDiscount = _get(LS_KEY_SHIP_DISCOUNT);
|
let shipDiscount = _get(LS_KEY_SHIP_DISCOUNT);
|
||||||
@@ -102,6 +104,13 @@ export class Persist extends EventEmitter {
|
|||||||
this.outfittingTab = _getString(LS_KEY_OUTFITTING_TAB);
|
this.outfittingTab = _getString(LS_KEY_OUTFITTING_TAB);
|
||||||
this.state = _get(LS_KEY_STATE);
|
this.state = _get(LS_KEY_STATE);
|
||||||
this.sizeRatio = _get(LS_KEY_SIZE_RATIO) || 1;
|
this.sizeRatio = _get(LS_KEY_SIZE_RATIO) || 1;
|
||||||
|
this.matsPerGrade = matsPerGrade || {
|
||||||
|
1: 2,
|
||||||
|
2: 2,
|
||||||
|
3: 4,
|
||||||
|
4: 4,
|
||||||
|
5: 10
|
||||||
|
};
|
||||||
this.tooltipsEnabled = tips === null ? true : tips;
|
this.tooltipsEnabled = tips === null ? true : tips;
|
||||||
this.moduleResistancesEnabled = moduleResistances === null ? true : moduleResistances;
|
this.moduleResistancesEnabled = moduleResistances === null ? true : moduleResistances;
|
||||||
|
|
||||||
@@ -152,6 +161,10 @@ export class Persist extends EventEmitter {
|
|||||||
this.moduleResistancesEnabled = !!newValue && newValue.toLowerCase() == 'true';
|
this.moduleResistancesEnabled = !!newValue && newValue.toLowerCase() == 'true';
|
||||||
this.emit('moduleresistances', this.moduleResistancesEnabled);
|
this.emit('moduleresistances', this.moduleResistancesEnabled);
|
||||||
break;
|
break;
|
||||||
|
case LS_KEY_ROLLS:
|
||||||
|
this.matsPerGrade = JSON.parse(newValue);
|
||||||
|
this.emit('matsPerGrade', this.matsPerGrade);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// On JSON.Parse Error - don't sync or do anything
|
// On JSON.Parse Error - don't sync or do anything
|
||||||
@@ -457,6 +470,23 @@ export class Persist extends EventEmitter {
|
|||||||
return this.moduleDiscount;
|
return this.moduleDiscount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the saved ship discount
|
||||||
|
* @param {Object} matsPerGrade # of rolls per grade
|
||||||
|
*/
|
||||||
|
setRolls(matsPerGrade) {
|
||||||
|
this.matsPerGrade = matsPerGrade;
|
||||||
|
_put(LS_KEY_ROLLS, this.matsPerGrade);
|
||||||
|
this.emit('matsPerGrade');
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the saved Mats per grade
|
||||||
|
* @return {Object} # of rolls per grade
|
||||||
|
*/
|
||||||
|
getRolls() {
|
||||||
|
return this.matsPerGrade;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Persist selected cost tab
|
* Persist selected cost tab
|
||||||
* @param {number} tabName Cost tab name
|
* @param {number} tabName Cost tab name
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import request from 'superagent';
|
|||||||
* @param {function} error Failure/Error callback
|
* @param {function} error Failure/Error callback
|
||||||
*/
|
*/
|
||||||
export default function shorternUrl(url, success, error) {
|
export default function shorternUrl(url, success, error) {
|
||||||
shortenUrlEddp(url, success, error);
|
shortenUrlOrbis(url, success, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SHORTEN_API_GOOGLE = 'https://www.googleapis.com/urlshortener/v1/url?key=';
|
const SHORTEN_API_GOOGLE = 'https://www.googleapis.com/urlshortener/v1/url?key=';
|
||||||
@@ -64,3 +64,32 @@ function shortenUrlEddp(url, success, error) {
|
|||||||
error('Not Online');
|
error('Not Online');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const SHORTEN_API_ORBIS = 'https://s.orbis.zone/a';
|
||||||
|
/**
|
||||||
|
* Shorten a URL using Orbis's URL shortener API
|
||||||
|
* @param {string} url The URL to shorten
|
||||||
|
* @param {function} success Success callback
|
||||||
|
* @param {function} error Failure/Error callback
|
||||||
|
*/
|
||||||
|
function shortenUrlOrbis(url, success, error) {
|
||||||
|
if (window.navigator.onLine) {
|
||||||
|
try {
|
||||||
|
request.post(SHORTEN_API_ORBIS)
|
||||||
|
.field('lsturl', url)
|
||||||
|
.field('format', 'json')
|
||||||
|
.end(function(err, response) {
|
||||||
|
if (err) {
|
||||||
|
error('Bad Request');
|
||||||
|
} else {
|
||||||
|
success(response.body.short);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
error(e.message ? e.message : e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error('Not Online');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user