travian/src/utils.ts

131 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import * as URLParse from 'url-parse';
export function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export async function sleepMicro() {
let ms = 2000 + Math.random() * 500;
return await sleep(ms);
}
export async function sleepShort() {
let ms = 3000 + Math.random() * 1000;
return await sleep(ms);
}
export async function sleepLong() {
let ms = 120_000 + Math.random() * 300_000;
return await sleep(ms);
}
export function aroundMinutes(minutes: number) {
const seconds = minutes * 60;
const delta = Math.floor(seconds * 0.9);
return seconds - delta + Math.floor(Math.random() * 2 * delta);
}
export async function waitForLoad() {
return new Promise(resolve => jQuery(resolve));
}
const ALPHABET = 'abcdefghijklmnopqrstuvwxyz1234567890';
const ALPHABET_LENGTH = ALPHABET.length - 1;
function generateId(count: number): string {
let str = '';
for (let i = 0; i < count; ++i) {
let symbolIndex = Math.floor(Math.random() * ALPHABET_LENGTH);
str += ALPHABET[symbolIndex];
}
return str;
}
export function uniqId(prefix: string = 'id'): string {
return prefix + generateId(6);
}
export function timestamp(): number {
return Math.floor(Date.now() / 1000);
}
export function trimPrefix(text: string, prefix: string): string {
return text.startsWith(prefix) ? text.substr(prefix.length) : text;
}
export function elClassId(classes: string | undefined, prefix: string): number | undefined {
if (classes === undefined) {
return undefined;
}
let result: number | undefined = undefined;
classes.split(/\s/).forEach(part => {
if (part.startsWith(prefix)) {
result = toNumber(part.substr(prefix.length));
}
});
return result;
}
export function* split(n: number, from: number = 2, to: number = 6) {
let c = n;
while (c > 0) {
const next = from + Math.floor(Math.random() * (to - from));
if (next < c) {
yield next;
c -= next;
} else {
yield c;
c = 0;
}
}
}
export function toNumber(value: any): number | undefined {
const normalized = String(value)
.replace('', '-')
.replace(/[^0-9-]/gi, '');
const converted = Number(normalized);
return isNaN(converted) ? undefined : converted;
}
export function getNumber(value: any, def: number = 0): number {
const converted = toNumber(value);
return converted === undefined ? def : converted;
}
export function parseLocation(location?: string | undefined) {
return new URLParse(location || window.location.href, true);
}
export function path(p: string, query: { [key: string]: string | number | undefined } = {}) {
let parts: string[] = [];
for (let k in query) {
if (query[k] !== undefined) {
parts.push(`${k}=${query[k]}`);
}
}
return p + (parts.length ? '?' + parts.join('&') : '');
}
export function notify(msg: string): void {
const n = new Notification(msg);
setTimeout(() => n && n.close(), 4000);
}
export function markPage(text: string, version: string) {
jQuery('body').append(
'<div style="' +
'position: absolute; ' +
'top: 0; left: 0; ' +
'background-color: white; ' +
'font-size: 24px; ' +
'z-index: 9999; ' +
'padding: 8px 6px; ' +
'color: black">' +
text +
' ' +
version +
'</div>'
);
}