diff --git a/.eslintignore b/.eslintignore
index db4c6d9b6..8baa9f15c 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,2 +1,5 @@
dist
-node_modules
\ No newline at end of file
+node_modules
+public/missing-locales
+public/images/custom
+public/images/uicons
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
index 32fb02bd8..63aa8e312 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -2,7 +2,8 @@
"extends": [
"airbnb",
"airbnb/rules/react",
- "eslint:recommended"
+ "eslint:recommended",
+ "prettier"
],
"parserOptions": {
"ecmaVersion": "latest"
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index e09776e06..758f5878c 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -2,20 +2,29 @@ name: Lint
on: [push]
jobs:
- Lint:
+ lint:
+ name: Run Basic Checks
runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [16.x]
steps:
- - uses: actions/checkout@v1
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v1
- with:
- node-version: ${{ matrix.node-version }}
+ - name: Checkout Code
+ id: checkout-code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 2
+ - name: Setup Node.js environment
+ uses: actions/setup-node@v2
+ with:
+ node-version: 16
+ cache: 'yarn'
- - name: Test the Testcases
- run:
- npm install -g yarn
- yarn install
- yarn build
+ - name: Install Dependencies
+ run: yarn
+
+ - name: Lint
+ run: yarn eslint:check
+
+ - name: Prettier
+ run: yarn prettier:check
+
+ - name: Build
+ run: yarn build
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 000000000..8baa9f15c
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,5 @@
+dist
+node_modules
+public/missing-locales
+public/images/custom
+public/images/uicons
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 000000000..05c968c02
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,5 @@
+{
+ "semi": false,
+ "trailingComma": "all",
+ "singleQuote": true
+}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index d75a05ba5..89f244ad1 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -5,6 +5,7 @@
"lokalise.i18n-ally",
"esbenp.prettier-vscode",
"leizongmin.node-module-intellisense",
- "eg2.vscode-npm-script"
+ "eg2.vscode-npm-script",
+ "graphql.vscode-graphql"
]
}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index f84806569..4bb8cedef 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,19 +3,12 @@
"public/base-locales"
],
"i18n-ally.keystyle": "flat",
- "[typescript]": {
- "editor.autoClosingBrackets": "always",
- "editor.defaultFormatter": "vscode.typescript-language-features"
- },
- "[typescriptreact]": {
- "editor.defaultFormatter": "vscode.typescript-language-features"
- },
"[javascript]": {
"editor.autoClosingBrackets": "always",
- "editor.defaultFormatter": "vscode.typescript-language-features"
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascriptreact]": {
"editor.autoClosingBrackets": "always",
- "editor.defaultFormatter": "vscode.typescript-language-features"
+ "editor.defaultFormatter": "esbenp.prettier-vscode"
},
}
\ No newline at end of file
diff --git a/package.json b/package.json
index c5f400436..c19ac46b8 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,11 @@
"migrate:make": "knex --knexfile server/knexfile.cjs migrate:make",
"migrate:latest": "knex --knexfile server/knexfile.cjs migrate:latest",
"migrate:rollback": "knex --knexfile server/knexfile.cjs migrate:rollback",
- "release": "node server/scripts/newRelease.js"
+ "release": "node server/scripts/newRelease.js",
+ "prettier:check": "prettier --check \"**/*.{js,jsx}\"",
+ "prettier:fix": "prettier --write \"**/*.{js,jsx}\"",
+ "eslint:check": "eslint \"**/*.{js,jsx}\"",
+ "eslint:fix": "eslint \"**/*.{js,jsx}\" --fix"
},
"engines": {
"node": ">=16",
@@ -39,12 +43,14 @@
"esbuild-server": "^0.1.0",
"eslint": "^8.9.0",
"eslint-config-airbnb": "^19.0.4",
+ "eslint-config-prettier": "^8.3.0",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-react": "^7.28.0",
"eslint-plugin-react-hooks": "^4.3.0",
- "nodemon": "^2.0.7"
+ "nodemon": "^2.0.7",
+ "prettier": "^2.6.2"
},
"dependencies": {
"@apollo/client": "^3.3.11",
@@ -108,4 +114,4 @@
"suncalc": "^1.8.0",
"zustand": "^4.0.0-rc.1"
}
-}
+}
\ No newline at end of file
diff --git a/server/scripts/configMigration.js b/server/scripts/configMigration.js
index d2280d718..c0fef0e71 100644
--- a/server/scripts/configMigration.js
+++ b/server/scripts/configMigration.js
@@ -1,94 +1,105 @@
/* eslint-disable no-console */
const fs = require('fs')
-const oldConfig = require('../src/configs/config.json')
+const { resolve } = require('path')
-const convertObjToArr = (obj) => obj ? Object.entries(obj).map(([k, v]) => ({
- name: k,
- ...v,
-})) : undefined
+const oldConfig = JSON.parse(
+ fs.readFileSync(resolve(__dirname, '../src/configs/config.json')),
+)
-const convertMapObject = (obj) => obj ? ({
- general: {
- title: obj?.title,
- headerTitle: obj?.headerTitle,
- startLat: obj?.startLat,
- startLon: obj?.startLon,
- startZoom: obj?.startZoom,
- minZoom: obj?.minZoom,
- maxZoom: obj?.maxZoom,
- interactionRangeZoom: obj?.interactionRangeZoom,
- },
- localeSelection: obj?.localeSelection,
- customRoutes: {
- discordAuthUrl: obj?.discordAuthUrl,
- telegramAuthUrl: obj?.telegramAuthUrl,
- telegramBotName: obj?.telegramBotEnvRef,
- localAuthUrl: obj?.localAuthUrl,
- },
- links: {
- discordInvite: obj?.discordInvite,
- feedbackLink: obj?.feedbackLink,
- statsLink: obj?.statsLink,
- rolesLinksName: obj?.rolesLinksName,
- rolesLink: obj?.rolesLink,
- },
- holidayEffects: {
- christmasSnow: obj?.christmasSnow,
- newYearsFireworks: obj?.newYearsFireworks,
- valentinesDay: obj?.valentinesDay,
- },
- misc: {
- enableMapJsFilter: obj?.legacyPkmnFilter,
- questRewardTypeFilters: obj?.questRewardTypeFilters,
- fetchLatestInvasions: obj?.fetchLatestInvasions,
- invasionCacheHrs: obj?.invasionCacheHrs,
- navigationControls: obj?.navigationControls,
- forceTutorial: obj?.forceTutorial,
- enableTutorial: obj?.enableTutorial,
- enableUserProfile: obj?.enableUserProfile,
- enableQuestSetSelector: obj?.enableQuestSetSelector,
- noScanAreaOverlay: obj?.noScanAreaOverlay,
- },
- theme: obj?.theme,
- clustering: {
- gyms: {
- zoomLevel: obj?.clusterZoomLevels?.gyms,
- forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
- },
- pokestops: {
- zoomLevel: obj?.clusterZoomLevels?.pokestops,
- forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
- },
- pokemon: {
- zoomLevel: obj?.clusterZoomLevels?.pokemon,
- forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
- },
- portals: {
- zoomLevel: obj?.clusterZoomLevels?.portals,
- forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
- },
- spawnpoints: {
- zoomLevel: obj?.clusterZoomLevels?.spawnpoints,
- forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
- },
- },
- messageOfTheDay: obj?.messageOfTheDay
- ? ensureMotd(obj?.messageOfTheDay)
- : undefined,
- donationPage: obj?.donationPage,
- loginPage: obj?.loginPage,
-}) : undefined
+const convertObjToArr = (obj) =>
+ obj
+ ? Object.entries(obj).map(([k, v]) => ({
+ name: k,
+ ...v,
+ }))
+ : undefined
+
+const convertMapObject = (obj) =>
+ obj
+ ? {
+ general: {
+ title: obj?.title,
+ headerTitle: obj?.headerTitle,
+ startLat: obj?.startLat,
+ startLon: obj?.startLon,
+ startZoom: obj?.startZoom,
+ minZoom: obj?.minZoom,
+ maxZoom: obj?.maxZoom,
+ interactionRangeZoom: obj?.interactionRangeZoom,
+ },
+ localeSelection: obj?.localeSelection,
+ customRoutes: {
+ discordAuthUrl: obj?.discordAuthUrl,
+ telegramAuthUrl: obj?.telegramAuthUrl,
+ telegramBotName: obj?.telegramBotEnvRef,
+ localAuthUrl: obj?.localAuthUrl,
+ },
+ links: {
+ discordInvite: obj?.discordInvite,
+ feedbackLink: obj?.feedbackLink,
+ statsLink: obj?.statsLink,
+ rolesLinksName: obj?.rolesLinksName,
+ rolesLink: obj?.rolesLink,
+ },
+ holidayEffects: {
+ christmasSnow: obj?.christmasSnow,
+ newYearsFireworks: obj?.newYearsFireworks,
+ valentinesDay: obj?.valentinesDay,
+ },
+ misc: {
+ enableMapJsFilter: obj?.legacyPkmnFilter,
+ questRewardTypeFilters: obj?.questRewardTypeFilters,
+ fetchLatestInvasions: obj?.fetchLatestInvasions,
+ invasionCacheHrs: obj?.invasionCacheHrs,
+ navigationControls: obj?.navigationControls,
+ forceTutorial: obj?.forceTutorial,
+ enableTutorial: obj?.enableTutorial,
+ enableUserProfile: obj?.enableUserProfile,
+ enableQuestSetSelector: obj?.enableQuestSetSelector,
+ noScanAreaOverlay: obj?.noScanAreaOverlay,
+ },
+ theme: obj?.theme,
+ clustering: {
+ gyms: {
+ zoomLevel: obj?.clusterZoomLevels?.gyms,
+ forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
+ },
+ pokestops: {
+ zoomLevel: obj?.clusterZoomLevels?.pokestops,
+ forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
+ },
+ pokemon: {
+ zoomLevel: obj?.clusterZoomLevels?.pokemon,
+ forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
+ },
+ portals: {
+ zoomLevel: obj?.clusterZoomLevels?.portals,
+ forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
+ },
+ spawnpoints: {
+ zoomLevel: obj?.clusterZoomLevels?.spawnpoints,
+ forcedLimit: obj?.clusterZoomLevels?.forcedClusterLimit,
+ },
+ },
+ messageOfTheDay: obj?.messageOfTheDay
+ ? ensureMotd(obj?.messageOfTheDay)
+ : undefined,
+ donationPage: obj?.donationPage,
+ loginPage: obj?.loginPage,
+ }
+ : undefined
const ensureMotd = (obj) => {
if (obj?.messages) {
- const updateFieldRec = (messages) => messages.map(message => {
- if (message.messages) {
- message.components = updateFieldRec(message.messages)
- delete message.messages
- }
- return message
- })
- obj.components = obj.messages.map(m => {
+ const updateFieldRec = (messages) =>
+ messages.map((message) => {
+ if (message.messages) {
+ message.components = updateFieldRec(message.messages)
+ delete message.messages
+ }
+ return message
+ })
+ obj.components = obj.messages.map((m) => {
if (m.type !== 'parent') return m
if (m.messages) {
m.components = m.components || updateFieldRec(m.messages)
@@ -102,19 +113,31 @@ const ensureMotd = (obj) => {
}
const mergeAuth = async () => {
- let authMethods = await fs.promises.readdir(`${__dirname}/../src/strategies`)
- .then(files => files
- .filter(file => file !== 'local.js' && file !== 'discord.js' && file !== 'telegram.js'))
+ let authMethods = await fs.promises
+ .readdir(`${__dirname}/../src/strategies`)
+ .then((files) =>
+ files.filter(
+ (file) =>
+ file !== 'local.js' &&
+ file !== 'discord.js' &&
+ file !== 'telegram.js',
+ ),
+ )
if (authMethods?.length) {
- authMethods = authMethods.map(file => file.replace('.js', ''))
- console.log('Found Custom Auth Methods:', authMethods, '\n', 'You should double check these were migrated correctly!')
+ authMethods = authMethods.map((file) => file.replace('.js', ''))
+ console.log(
+ 'Found Custom Auth Methods:',
+ authMethods,
+ '\n',
+ 'You should double check these were migrated correctly!',
+ )
}
- const flattenArray = (perm) => ([
- ...oldConfig?.discord?.perms?.[perm]?.roles || [],
- ...oldConfig?.telegram?.perms?.[perm]?.roles || [],
- ...authMethods.flatMap(m => oldConfig?.[m]?.perms[perm]?.roles || []),
- ])
+ const flattenArray = (perm) => [
+ ...(oldConfig?.discord?.perms?.[perm]?.roles || []),
+ ...(oldConfig?.telegram?.perms?.[perm]?.roles || []),
+ ...authMethods.flatMap((m) => oldConfig?.[m]?.perms[perm]?.roles || []),
+ ]
const discordObj = (obj, name) => ({
name,
@@ -146,22 +169,28 @@ const mergeAuth = async () => {
type: 'local',
})
- const checkEnabled = (perm) => oldConfig?.discord?.perms?.[perm]?.enabled
- || oldConfig?.telegram?.perms?.[perm]?.enabled || false
+ const checkEnabled = (perm) =>
+ oldConfig?.discord?.perms?.[perm]?.enabled ||
+ oldConfig?.telegram?.perms?.[perm]?.enabled ||
+ false
const baseAuth = {
strategies: [],
areaRestrictions: [
- ...oldConfig?.discord?.areaRestrictions || [],
- ...oldConfig?.telegram?.areaRestrictions || [],
- ...oldConfig?.local?.areaRestrictions || [],
- ...authMethods.flatMap(m => oldConfig?.[m]?.areaRestrictions || []),
+ ...(oldConfig?.discord?.areaRestrictions || []),
+ ...(oldConfig?.telegram?.areaRestrictions || []),
+ ...(oldConfig?.local?.areaRestrictions || []),
+ ...authMethods.flatMap((m) => oldConfig?.[m]?.areaRestrictions || []),
],
excludeFromTutorial: oldConfig?.excludeFromTutorial
- ? oldConfig.excludeFromTutorial.map(perm => perm === 's2cells' ? 'scanCells' : perm)
+ ? oldConfig.excludeFromTutorial.map((perm) =>
+ perm === 's2cells' ? 'scanCells' : perm,
+ )
: undefined,
alwaysEnabledPerms: oldConfig?.alwaysEnabledPerms
- ? oldConfig.alwaysEnabledPerms.map(perm => perm === 's2cells' ? 'scanCells' : perm)
+ ? oldConfig.alwaysEnabledPerms.map((perm) =>
+ perm === 's2cells' ? 'scanCells' : perm,
+ )
: undefined,
perms: {
map: {
@@ -251,11 +280,11 @@ const mergeAuth = async () => {
if (oldConfig?.local) {
baseAuth.strategies.push(localObj(oldConfig?.local, 'local'))
if (oldConfig?.local?.perms) {
- oldConfig.local.perms.forEach(perm => {
+ oldConfig.local.perms.forEach((perm) => {
if (perm === 's2cells') {
baseAuth.perms.scanCells.roles.push('local')
} else {
- Object.keys(baseAuth.perms).forEach(key => {
+ Object.keys(baseAuth.perms).forEach((key) => {
if (perm.includes(key)) {
baseAuth.perms[key].roles.push('local')
}
@@ -264,7 +293,7 @@ const mergeAuth = async () => {
})
}
}
- authMethods.forEach(m => {
+ authMethods.forEach((m) => {
if (m.toLowerCase().includes('discord')) {
baseAuth.strategies.push(discordObj(oldConfig[m], m))
} else if (m.toLowerCase().includes('telegram')) {
@@ -272,7 +301,11 @@ const mergeAuth = async () => {
} else if (m.toLowerCase().includes('local')) {
baseAuth.strategies.push(localObj(oldConfig[m], m))
} else {
- console.warn('Unable to process Auth Method:', m, 'you will need to manually migrate this!')
+ console.warn(
+ 'Unable to process Auth Method:',
+ m,
+ 'you will need to manually migrate this!',
+ )
}
})
return baseAuth
@@ -297,23 +330,25 @@ const rebuildConfig = async () => ({
},
multiDomains: oldConfig.multiDomains
? Object.entries(oldConfig.multiDomains).map(([domain, values]) => ({
- domain,
- ...convertMapObject(values),
- }))
+ domain,
+ ...convertMapObject(values),
+ }))
: undefined,
map: convertMapObject(oldConfig?.map),
clientSideOptions: oldConfig?.clientSideOptions,
- defaultFilters: oldConfig?.defaultFilters ? {
- ...oldConfig?.defaultFilters,
- pokemon: {
- ...oldConfig?.defaultFilters?.pokemon,
- globalValues: {
- ...oldConfig?.defaultFilters?.pokemon?.globalValues,
- pvp: oldConfig?.defaultFilters?.pokemon?.pvpValues,
- },
- pvpValues: undefined,
- },
- } : undefined,
+ defaultFilters: oldConfig?.defaultFilters
+ ? {
+ ...oldConfig?.defaultFilters,
+ pokemon: {
+ ...oldConfig?.defaultFilters?.pokemon,
+ globalValues: {
+ ...oldConfig?.defaultFilters?.pokemon?.globalValues,
+ pvp: oldConfig?.defaultFilters?.pokemon?.pvpValues,
+ },
+ pvpValues: undefined,
+ },
+ }
+ : undefined,
database: {
settings: {
...oldConfig?.database?.settings,
@@ -321,7 +356,7 @@ const rebuildConfig = async () => ({
reactMapHandlesPvp: undefined,
pvpLevels: undefined,
},
- schemas: Object.values(oldConfig?.database?.schemas).map(s => {
+ schemas: Object.values(oldConfig?.database?.schemas).map((s) => {
if (s.useFor.includes('s2cell')) {
const s2cellIndex = s.useFor.indexOf('s2cell')
s.useFor[s2cellIndex] = 'scanCell'
@@ -341,13 +376,16 @@ const rebuildConfig = async () => ({
const cleanConfig = (obj, round) => {
Object.entries(obj).forEach(([key, value]) => {
if (Array.isArray(value)) {
- value.forEach(subObj => {
+ value.forEach((subObj) => {
if (typeof subObj === 'object') {
cleanConfig(subObj, round)
}
})
} else if (typeof value === 'object') {
- if (!Object.keys(value).length || Object.values(value).every(v => v === undefined)) {
+ if (
+ !Object.keys(value).length ||
+ Object.values(value).every((v) => v === undefined)
+ ) {
delete obj[key]
console.log('Removed empty object:', key, round)
} else {
@@ -371,7 +409,7 @@ const migrator = async () => {
`${__dirname}/../src/configs/local.json`,
JSON.stringify(config, null, 2),
'utf8',
- () => { },
+ () => {},
)
}
diff --git a/server/scripts/createLocales.js b/server/scripts/createLocales.js
index 3b201c20d..bdce8cd2f 100644
--- a/server/scripts/createLocales.js
+++ b/server/scripts/createLocales.js
@@ -10,77 +10,123 @@ const missingFolder = path.resolve(__dirname, '../../public/missing-locales')
const locales = async () => {
const localTranslations = await fs.promises.readdir(appLocalesFolder)
- const englishRef = fs.readFileSync(path.resolve(appLocalesFolder, 'en.json'), { encoding: 'utf8', flag: 'r' })
-
- fs.mkdir(finalLocalesFolder, (error) => error ? console.log('[LOCALES] Locales folder already exists, skipping') : console.log('[LOCALES] locales folder created'))
-
- const availableRemote = await fetchJson('https://raw.githubusercontent.com/WatWowMap/pogo-translations/master/index.json')
-
- await Promise.all(localTranslations.map(async locale => {
- const reactMapTranslations = fs.readFileSync(path.resolve(appLocalesFolder, locale), { encoding: 'utf8', flag: 'r' })
- const baseName = locale.replace('.json', '')
- const trimmedRemoteFiles = {}
-
- fs.mkdir(`${finalLocalesFolder}/${baseName}`, (error) => error ? {} : console.log(`[LOCALES] ${locale} folder created`))
-
- try {
- const hasRemote = availableRemote.includes(locale)
- const remoteFiles = await fetchJson(`https://raw.githubusercontent.com/WatWowMap/pogo-translations/master/static/locales/${hasRemote ? baseName : 'en'}.json`)
+ const englishRef = fs.readFileSync(
+ path.resolve(appLocalesFolder, 'en.json'),
+ { encoding: 'utf8', flag: 'r' },
+ )
+
+ fs.mkdir(finalLocalesFolder, (error) =>
+ error
+ ? console.log('[LOCALES] Locales folder already exists, skipping')
+ : console.log('[LOCALES] locales folder created'),
+ )
+
+ const availableRemote = await fetchJson(
+ 'https://raw.githubusercontent.com/WatWowMap/pogo-translations/master/index.json',
+ )
+
+ await Promise.all(
+ localTranslations.map(async (locale) => {
+ const reactMapTranslations = fs.readFileSync(
+ path.resolve(appLocalesFolder, locale),
+ { encoding: 'utf8', flag: 'r' },
+ )
+ const baseName = locale.replace('.json', '')
+ const trimmedRemoteFiles = {}
+
+ fs.mkdir(`${finalLocalesFolder}/${baseName}`, (error) =>
+ error ? {} : console.log(`[LOCALES] ${locale} folder created`),
+ )
+
+ try {
+ const hasRemote = availableRemote.includes(locale)
+ const remoteFiles = await fetchJson(
+ `https://raw.githubusercontent.com/WatWowMap/pogo-translations/master/static/locales/${
+ hasRemote ? baseName : 'en'
+ }.json`,
+ )
+
+ if (!hasRemote) {
+ console.warn(
+ '[LOCALES] No remote translation found for',
+ locale,
+ 'using English',
+ )
+ }
- if (!hasRemote) {
- console.warn('[LOCALES] No remote translation found for', locale, 'using English')
+ Object.keys(remoteFiles).forEach((key) => {
+ if (
+ !key.startsWith('desc_') &&
+ !key.startsWith('pokemon_category_')
+ ) {
+ if (key.startsWith('quest_') || key.startsWith('challenge_')) {
+ trimmedRemoteFiles[key] = remoteFiles[key]
+ .replace(/%\{/g, '{{')
+ .replace(/\}/g, '}}')
+ } else {
+ trimmedRemoteFiles[key] = remoteFiles[key]
+ }
+ }
+ })
+ } catch (e) {
+ console.warn(e, '\n', locale)
}
- Object.keys(remoteFiles).forEach(key => {
- if (!key.startsWith('desc_') && !key.startsWith('pokemon_category_')) {
- if (key.startsWith('quest_') || key.startsWith('challenge_')) {
- trimmedRemoteFiles[key] = remoteFiles[key]
- .replace(/%\{/g, '{{')
- .replace(/\}/g, '}}')
- } else {
- trimmedRemoteFiles[key] = remoteFiles[key]
- }
- }
- })
- } catch (e) {
- console.warn(e, '\n', locale)
- }
-
- const finalTranslations = {
- ...JSON.parse(englishRef),
- ...trimmedRemoteFiles,
- ...JSON.parse(reactMapTranslations),
- }
- fs.writeFile(
- path.resolve(finalLocalesFolder, baseName, 'translation.json'),
- JSON.stringify(finalTranslations, null, 2),
- 'utf8',
- () => { },
- )
- console.log(`[LOCALES] ${locale}`, 'file saved.')
- }))
+ const finalTranslations = {
+ ...JSON.parse(englishRef),
+ ...trimmedRemoteFiles,
+ ...JSON.parse(reactMapTranslations),
+ }
+ fs.writeFile(
+ path.resolve(finalLocalesFolder, baseName, 'translation.json'),
+ JSON.stringify(finalTranslations, null, 2),
+ 'utf8',
+ () => {},
+ )
+ console.log(`[LOCALES] ${locale}`, 'file saved.')
+ }),
+ )
}
const missing = async () => {
const localTranslations = await fs.promises.readdir(appLocalesFolder)
- const englishRef = JSON.parse(fs.readFileSync(path.resolve(appLocalesFolder, 'en.json'), { encoding: 'utf8', flag: 'r' }))
-
- fs.mkdir(missingFolder, (error) => error ? {} : console.log('[LOCALES] Locales folder created'))
-
- localTranslations.forEach(locale => {
- const reactMapTranslations = JSON.parse(fs.readFileSync(path.resolve(appLocalesFolder, locale), { encoding: 'utf8', flag: 'r' }))
+ const englishRef = JSON.parse(
+ fs.readFileSync(path.resolve(appLocalesFolder, 'en.json'), {
+ encoding: 'utf8',
+ flag: 'r',
+ }),
+ )
+
+ fs.mkdir(missingFolder, (error) =>
+ error ? {} : console.log('[LOCALES] Locales folder created'),
+ )
+
+ localTranslations.forEach((locale) => {
+ const reactMapTranslations = JSON.parse(
+ fs.readFileSync(path.resolve(appLocalesFolder, locale), {
+ encoding: 'utf8',
+ flag: 'r',
+ }),
+ )
const missingKeys = {}
- Object.keys(englishRef).forEach(key => {
+ Object.keys(englishRef).forEach((key) => {
if (!reactMapTranslations[key]) {
- missingKeys[key] = process.argv.includes('--ally') ? `t('${key}')` : englishRef[key]
+ missingKeys[key] = process.argv.includes('--ally')
+ ? `t('${key}')`
+ : englishRef[key]
}
})
fs.writeFile(
- path.resolve(missingFolder, process.argv.includes('--ally') ? locale.replace('.json', '.js') : locale),
+ path.resolve(
+ missingFolder,
+ process.argv.includes('--ally')
+ ? locale.replace('.json', '.js')
+ : locale,
+ ),
JSON.stringify(missingKeys, null, 2),
'utf8',
- () => { },
+ () => {},
)
console.log(`[LOCALES] ${locale}`, 'file saved.')
})
@@ -93,6 +139,8 @@ if (require.main === module) {
locales().then(() => console.log('[LOCALES] Translations generated'))
if (process.argv[2] === '--missing') {
- missing().then(() => console.log('[LOCALES] Missing translations generated'))
+ missing().then(() =>
+ console.log('[LOCALES] Missing translations generated'),
+ )
}
}
diff --git a/server/scripts/genEnvConfig.js b/server/scripts/genEnvConfig.js
index c2dbcd494..b732e766f 100644
--- a/server/scripts/genEnvConfig.js
+++ b/server/scripts/genEnvConfig.js
@@ -2,7 +2,8 @@
const fs = require('fs')
const sourceConfig = require('../src/configs/default.json')
-const camelToSnake = str => str.replace(/([a-z](?=[A-Z]))/g, '$1_').toUpperCase()
+const camelToSnake = (str) =>
+ str.replace(/([a-z](?=[A-Z]))/g, '$1_').toUpperCase()
const recursiveObjCheck = (obj, key = '', parentKey = '') => {
const snakeKey = `${parentKey}${camelToSnake(key)}`
@@ -11,9 +12,10 @@ const recursiveObjCheck = (obj, key = '', parentKey = '') => {
}
if (typeof obj === 'object') {
return Object.fromEntries(
- Object.entries(obj).map(([k, v]) => (
- [k, recursiveObjCheck(v, k, key ? `${snakeKey}_` : snakeKey)]
- )),
+ Object.entries(obj).map(([k, v]) => [
+ k,
+ recursiveObjCheck(v, k, key ? `${snakeKey}_` : snakeKey),
+ ]),
)
}
return typeof obj === 'string'
diff --git a/server/scripts/generateMasterfile.js b/server/scripts/generateMasterfile.js
index a251531b9..ed57b315b 100644
--- a/server/scripts/generateMasterfile.js
+++ b/server/scripts/generateMasterfile.js
@@ -10,7 +10,7 @@ const getRarityLevel = (id, pkmn) => {
let pkmnRarity
for (const [tier, pokemon] of Object.entries(defaultRarity)) {
if (rarity?.[tier]?.length) {
- if (rarity[tier].includes((parseInt(id)))) {
+ if (rarity[tier].includes(parseInt(id))) {
pkmnRarity = tier
}
} else if (pokemon.includes(parseInt(id))) {
@@ -25,9 +25,11 @@ const getRarityLevel = (id, pkmn) => {
const generate = async (save) => {
try {
- const masterfile = await fetchJson('https://raw.githubusercontent.com/WatWowMap/Masterfile-Generator/master/master-latest-react-map.json')
+ const masterfile = await fetchJson(
+ 'https://raw.githubusercontent.com/WatWowMap/Masterfile-Generator/master/master-latest-react-map.json',
+ )
- Object.values(masterfile.pokemon).forEach(pokemon => {
+ Object.values(masterfile.pokemon).forEach((pokemon) => {
pokemon.rarity = getRarityLevel(pokemon.pokedexId, pokemon)
pokemon.types = pokemon.types || []
delete pokemon.mythical
@@ -39,7 +41,7 @@ const generate = async (save) => {
path.resolve(`${__dirname}/../src/data/masterfile.json`),
JSON.stringify(masterfile, null, 2),
'utf8',
- () => { },
+ () => {},
)
}
return masterfile
diff --git a/server/scripts/newRelease.js b/server/scripts/newRelease.js
index 4673d9ee4..f717f203d 100644
--- a/server/scripts/newRelease.js
+++ b/server/scripts/newRelease.js
@@ -24,18 +24,24 @@ try {
throw new Error(err1)
}
console.log(stdout1)
- exec(`sentry-cli releases files ${version} upload-sourcemaps ${path.resolve(__dirname, '../../dist')}`, (err2, stdout2) => {
- if (err2) {
- throw new Error(err2)
- }
- console.log(stdout2)
- exec(`sentry-cli releases finalize ${version}`, (err3, stdout3) => {
- if (err3) {
- throw new Error(err3)
+ exec(
+ `sentry-cli releases files ${version} upload-sourcemaps ${path.resolve(
+ __dirname,
+ '../../dist',
+ )}`,
+ (err2, stdout2) => {
+ if (err2) {
+ throw new Error(err2)
}
- console.log(stdout3)
- })
- })
+ console.log(stdout2)
+ exec(`sentry-cli releases finalize ${version}`, (err3, stdout3) => {
+ if (err3) {
+ throw new Error(err3)
+ }
+ console.log(stdout3)
+ })
+ },
+ )
})
})
} catch (e) {
diff --git a/server/scripts/poracleToGeoJSON.js b/server/scripts/poracleToGeoJSON.js
index 1c4bdbd7d..36bbfcbbb 100644
--- a/server/scripts/poracleToGeoJSON.js
+++ b/server/scripts/poracleToGeoJSON.js
@@ -1,17 +1,23 @@
/* eslint-disable no-console */
/**
-* Credits: https://gist.github.com/moriakaice
-* Editor: PJ0tterr
-* Created on: 15-01-2022
-* Modified on: 23-01-2022
-*/
+ * Credits: https://gist.github.com/moriakaice
+ * Editor: PJ0tterr
+ * Created on: 15-01-2022
+ * Modified on: 23-01-2022
+ */
const fs = require('fs')
const path = require('path')
// Set Path where for area.json
-const configFolderArea = path.resolve(__dirname, '../../server/src/configs/areas.json')
-const geofencesFile = path.resolve(__dirname, '../../server/src/configs/geofence.json')
+const configFolderArea = path.resolve(
+ __dirname,
+ '../../server/src/configs/areas.json',
+)
+const geofencesFile = path.resolve(
+ __dirname,
+ '../../server/src/configs/geofence.json',
+)
if (fs.existsSync(geofencesFile)) {
const outGeoJSON = {
@@ -37,7 +43,6 @@ if (fs.existsSync(geofencesFile)) {
name: inGeofence.name || '',
color: inGeofence.color || '#000000',
id: inGeofence.id || 0,
-
},
geometry: {
type: 'Polygon',
@@ -49,16 +54,27 @@ if (fs.existsSync(geofencesFile)) {
inGeofence.path[j] = [coord[1], coord[0]]
}
const lastCoords = inGeofence.path.slice(-1)
- if (inGeofence.path[0][0] !== lastCoords[0][0] || inGeofence.path[0][1] !== lastCoords[0][1]) {
+ if (
+ inGeofence.path[0][0] !== lastCoords[0][0] ||
+ inGeofence.path[0][1] !== lastCoords[0][1]
+ ) {
inGeofence.path.push(inGeofence.path[0])
}
outGeofence.geometry.coordinates[0] = inGeofence.path
outGeoJSON.features.push(outGeofence)
}
- const outFilePath = path.resolve(path.dirname(configFolderArea), 'areas.json')
+ const outFilePath = path.resolve(
+ path.dirname(configFolderArea),
+ 'areas.json',
+ )
- fs.writeFile(outFilePath, JSON.stringify(outGeoJSON, null, 2), 'utf8', () => {
- console.log(`${outFilePath} file saved.`)
- })
+ fs.writeFile(
+ outFilePath,
+ JSON.stringify(outGeoJSON, null, 2),
+ 'utf8',
+ () => {
+ console.log(`${outFilePath} file saved.`)
+ },
+ )
})
}
diff --git a/server/src/graphql/mapTypes.js b/server/src/graphql/mapTypes.js
index f8683a45b..8e6762f48 100644
--- a/server/src/graphql/mapTypes.js
+++ b/server/src/graphql/mapTypes.js
@@ -1,27 +1,27 @@
const { gql } = require('apollo-server-express')
module.exports = gql`
- type Available {
- masterfile: JSON
- pokestops: [String]
- gyms: [String]
- pokemon: [String]
- nests: [String]
- filters: JSON
- questConditions: JSON
- }
-
- type Badge {
- id: String
- name: String
- url: String
- lat: Float
- lon: Float
- badge: Int
- deleted: Boolean
- }
-
- type Geocoder {
+ type Available {
+ masterfile: JSON
+ pokestops: [String]
+ gyms: [String]
+ pokemon: [String]
+ nests: [String]
+ filters: JSON
+ questConditions: JSON
+ }
+
+ type Badge {
+ id: String
+ name: String
+ url: String
+ lat: Float
+ lon: Float
+ badge: Int
+ deleted: Boolean
+ }
+
+ type Geocoder {
latitude: Float
longitude: Float
streetNumber: String
@@ -37,7 +37,7 @@ module.exports = gql`
}
type Geometry {
- type: String
+ type: String
coordinates: [[[Float]]]
}
diff --git a/server/src/graphql/poracleTypes.js b/server/src/graphql/poracleTypes.js
index e970c2599..4eed84499 100644
--- a/server/src/graphql/poracleTypes.js
+++ b/server/src/graphql/poracleTypes.js
@@ -155,7 +155,7 @@ module.exports = gql`
shiny: Boolean
description: String
}
-
+
type PoracleNest {
uid: Int
id: ID
diff --git a/server/src/graphql/resolvers.js b/server/src/graphql/resolvers.js
index 829907447..d6d90151f 100644
--- a/server/src/graphql/resolvers.js
+++ b/server/src/graphql/resolvers.js
@@ -11,7 +11,8 @@ module.exports = {
JSON: GraphQLJSON,
Query: {
available: (_, args, { Event, Db, perms, version }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
const available = {
pokemon: perms.pokemon ? Event.available.pokemon : [],
@@ -27,7 +28,8 @@ module.exports = {
}
},
badges: async (_, args, { req, perms, Db, version }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.gymBadges) {
@@ -37,7 +39,8 @@ module.exports = {
return []
},
devices: (_, args, { perms, Db, version }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.devices) {
@@ -46,7 +49,8 @@ module.exports = {
return []
},
geocoder: (_, args, { perms, version, Event }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.webhooks) {
@@ -58,7 +62,8 @@ module.exports = {
return []
},
gyms: (_, args, { perms, version, req, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.gyms || perms?.raids) {
@@ -67,7 +72,8 @@ module.exports = {
return []
},
gymsSingle: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.[args.perm]) {
@@ -76,7 +82,8 @@ module.exports = {
return {}
},
nests: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.nests) {
@@ -85,7 +92,8 @@ module.exports = {
return []
},
nestsSingle: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.[args.perm]) {
@@ -94,19 +102,23 @@ module.exports = {
return {}
},
pokestops: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
- if (perms?.pokestops
- || perms?.lures
- || perms?.quests
- || perms?.invasions) {
+ if (
+ perms?.pokestops ||
+ perms?.lures ||
+ perms?.quests ||
+ perms?.invasions
+ ) {
return Db.getAll('Pokestop', perms, args)
}
return []
},
pokestopsSingle: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.[args.perm]) {
@@ -115,7 +127,8 @@ module.exports = {
return {}
},
pokemon: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.pokemon) {
@@ -127,7 +140,8 @@ module.exports = {
return []
},
pokemonSingle: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.[args.perm]) {
@@ -136,7 +150,8 @@ module.exports = {
return {}
},
portals: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.portals) {
@@ -145,7 +160,8 @@ module.exports = {
return []
},
portalsSingle: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.[args.perm]) {
@@ -154,7 +170,8 @@ module.exports = {
return {}
},
scanCells: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.scanCells && args.zoom >= config.map.scanCellsZoom) {
@@ -163,7 +180,8 @@ module.exports = {
return []
},
scanAreas: (_, args, { perms, version, req }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
const scanAreas = config.scanAreas[req.headers.host]
@@ -172,8 +190,8 @@ module.exports = {
if (perms?.scanAreas && scanAreas.features.length) {
try {
scanAreas.features = scanAreas.features
- .filter(feature => !feature.properties.hidden)
- .sort((a, b) => (a.properties.name > b.properties.name) ? 1 : -1)
+ .filter((feature) => !feature.properties.hidden)
+ .sort((a, b) => (a.properties.name > b.properties.name ? 1 : -1))
} catch (e) {
console.warn('[WARN] Failed to sort scan areas', e.message)
}
@@ -182,7 +200,8 @@ module.exports = {
return [{ features: [] }]
},
search: async (_, args, { Event, perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
const { category, webhookName, search } = args
@@ -199,11 +218,16 @@ module.exports = {
const results = await Db.search('Gym', perms, args)
const webhook = webhookName ? Event.webhookObj[webhookName] : null
if (webhook && results.length) {
- const withFormatted = await Promise.all(results.map(async result => ({
- ...result,
- formatted:
- await Utility.geocoder(webhook.server.nominatimUrl, { lat: result.lat, lon: result.lon }, true),
- })))
+ const withFormatted = await Promise.all(
+ results.map(async (result) => ({
+ ...result,
+ formatted: await Utility.geocoder(
+ webhook.server.nominatimUrl,
+ { lat: result.lat, lon: result.lon },
+ true,
+ ),
+ })),
+ )
return withFormatted
}
return results
@@ -212,13 +236,15 @@ module.exports = {
return Db.search('Portal', perms, args)
case 'nests':
return Db.search('Nest', perms, args)
- default: return []
+ default:
+ return []
}
}
return []
},
searchQuest: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
const { category, search } = args
@@ -231,7 +257,8 @@ module.exports = {
return []
},
spawnpoints: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.spawnpoints) {
@@ -240,22 +267,30 @@ module.exports = {
return []
},
submissionCells: async (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
- if (perms?.submissionCells && args.zoom >= config.map.submissionZoom - 1) {
+ if (
+ perms?.submissionCells &&
+ args.zoom >= config.map.submissionZoom - 1
+ ) {
const [pokestops, gyms] = await Db.submissionCells(args)
- return [{
- placementCells: args.zoom >= config.map.submissionZoom
- ? Utility.getPlacementCells(args, pokestops, gyms)
- : [],
- typeCells: Utility.getTypeCells(args, pokestops, gyms),
- }]
+ return [
+ {
+ placementCells:
+ args.zoom >= config.map.submissionZoom
+ ? Utility.getPlacementCells(args, pokestops, gyms)
+ : [],
+ typeCells: Utility.getTypeCells(args, pokestops, gyms),
+ },
+ ]
}
return [{ placementCells: [], typeCells: [] }]
},
weather: (_, args, { perms, version, Db }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.weather) {
@@ -264,16 +299,23 @@ module.exports = {
return []
},
webhook: (_, args, { perms, version, req }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
if (perms?.webhooks) {
- return Fetch.webhookApi(args.category, Utility.evalWebhookId(req.user), args.status, args.name)
+ return Fetch.webhookApi(
+ args.category,
+ Utility.evalWebhookId(req.user),
+ args.status,
+ args.name,
+ )
}
return {}
},
scanner: (_, args, { perms, version }) => {
- if (args.version && args.version !== version) throw new UserInputError('old_client')
+ if (args.version && args.version !== version)
+ throw new UserInputError('old_client')
if (!perms) throw new AuthenticationError('session_expired')
const { category, method, data } = args
@@ -291,7 +333,13 @@ module.exports = {
const perms = req.user ? req.user.perms : false
const { category, data, status, name } = args
if (perms?.webhooks?.includes(name)) {
- return Fetch.webhookApi(category, Utility.evalWebhookId(req.user), status, name, data)
+ return Fetch.webhookApi(
+ category,
+ Utility.evalWebhookId(req.user),
+ status,
+ name,
+ data,
+ )
}
return {}
},
@@ -318,15 +366,21 @@ module.exports = {
return false
},
checkUsername: async (_, args) => {
- const results = await User.query()
- .where('username', args.username)
+ const results = await User.query().where('username', args.username)
return Boolean(results.length)
},
setGymBadge: async (_, args, { req }) => {
const perms = req.user ? req.user.perms : false
if (perms?.gymBadges && req?.user?.id) {
- if (await Badge.query().where('gymId', args.gymId).andWhere('userId', req.user.id).first()) {
- await Badge.query().where('gymId', args.gymId).andWhere('userId', req.user.id)
+ if (
+ await Badge.query()
+ .where('gymId', args.gymId)
+ .andWhere('userId', req.user.id)
+ .first()
+ ) {
+ await Badge.query()
+ .where('gymId', args.gymId)
+ .andWhere('userId', req.user.id)
.update({ badge: args.badge })
} else {
await Badge.query().insert({
diff --git a/server/src/graphql/typeDefs.js b/server/src/graphql/typeDefs.js
index 49b1966be..80ca90aa6 100644
--- a/server/src/graphql/typeDefs.js
+++ b/server/src/graphql/typeDefs.js
@@ -15,25 +15,120 @@ module.exports = gql`
badges(version: String): [Badge]
devices(version: String): [Device]
geocoder(search: String, name: String, version: String): [Geocoder]
- gyms(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, filters: JSON, version: String): [Gym]
+ gyms(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ filters: JSON
+ version: String
+ ): [Gym]
gymsSingle(id: ID, perm: String, version: String): Gym
- nests(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, filters: JSON, version: String): [Nest]
+ nests(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ filters: JSON
+ version: String
+ ): [Nest]
nestsSingle(id: ID, perm: String, version: String): Nest
- pokestops(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, midnight: Int, filters: JSON, version: String): [Pokestop]
+ pokestops(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ midnight: Int
+ filters: JSON
+ version: String
+ ): [Pokestop]
pokestopsSingle(id: ID, perm: String, version: String): Pokestop
- pokemon(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, filters: JSON, version: String): [Pokemon]
+ pokemon(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ filters: JSON
+ version: String
+ ): [Pokemon]
pokemonSingle(id: ID, perm: String, version: String): Pokemon
- portals(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, filters: JSON, version: String): [Portal]
+ portals(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ filters: JSON
+ version: String
+ ): [Portal]
portalsSingle(id: ID, perm: String, version: String): Portal
- scanCells(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, filters: JSON, zoom: Int, version: String): [ScanCell]
+ scanCells(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ filters: JSON
+ zoom: Int
+ version: String
+ ): [ScanCell]
scanAreas(version: String): [ScanArea]
- search(search: String, category: String, lat: Float, lon: Float, locale: String, webhookName: String, ts: Int, midnight: Int, version: String): [Search]
- searchQuest(search: String, category: String, lat: Float, lon: Float, locale: String, webhookName: String, midnight: Int, version: String): [SearchQuest]
- spawnpoints(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, filters: JSON, version: String): [Spawnpoint]
- submissionCells(minLat: Float, maxLat: Float, minLon: Float, maxLon: Float, ts: Int, zoom: Int, version: String): [SubmissionCell]
+ search(
+ search: String
+ category: String
+ lat: Float
+ lon: Float
+ locale: String
+ webhookName: String
+ ts: Int
+ midnight: Int
+ version: String
+ ): [Search]
+ searchQuest(
+ search: String
+ category: String
+ lat: Float
+ lon: Float
+ locale: String
+ webhookName: String
+ midnight: Int
+ version: String
+ ): [SearchQuest]
+ spawnpoints(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ filters: JSON
+ version: String
+ ): [Spawnpoint]
+ submissionCells(
+ minLat: Float
+ maxLat: Float
+ minLon: Float
+ maxLon: Float
+ ts: Int
+ zoom: Int
+ version: String
+ ): [SubmissionCell]
weather(version: String): [Weather]
- webhook(category: String, status: String, name: String, version: String): Poracle
- scanner(category: String, method: String, data: JSON, version: String): ScannerApi
+ webhook(
+ category: String
+ status: String
+ name: String
+ version: String
+ ): Poracle
+ scanner(
+ category: String
+ method: String
+ data: JSON
+ version: String
+ ): ScannerApi
}
type Mutation {
diff --git a/server/src/index.js b/server/src/index.js
index 0d4d9ab69..54e002d57 100644
--- a/server/src/index.js
+++ b/server/src/index.js
@@ -43,7 +43,10 @@ const server = new ApolloServer({
if (config.devOptions.enabled) {
console.warn(e)
}
- if (e instanceof ValidationError || e?.message.includes('skipUndefined()')) {
+ if (
+ e instanceof ValidationError ||
+ e?.message.includes('skipUndefined()')
+ ) {
return { message: 'old_client' }
}
if (['old_client', 'session_expired'].includes(e.message)) {
@@ -57,20 +60,25 @@ const server = new ApolloServer({
server.start().then(() => server.applyMiddleware({ app, path: '/graphql' }))
if (config.devOptions.enabled) {
- app.use(logger((tokens, req, res) => [
- tokens.method(req, res),
- tokens.url(req, res),
- tokens.status(req, res),
- tokens['response-time'](req, res),
- 'ms',
- req.user ? `- ${req.user.username}` : 'Not Logged In',
- '-',
- req.headers['x-forwarded-for'],
- ].join(' ')))
+ app.use(
+ logger((tokens, req, res) =>
+ [
+ tokens.method(req, res),
+ tokens.url(req, res),
+ tokens.status(req, res),
+ tokens['response-time'](req, res),
+ 'ms',
+ req.user ? `- ${req.user.username}` : 'Not Logged In',
+ '-',
+ req.headers['x-forwarded-for'],
+ ].join(' '),
+ ),
+ )
}
const RateLimitTime = config.api.rateLimit.time * 60 * 1000
-const MaxRequestsPerHour = config.api.rateLimit.requests * (RateLimitTime / 1000)
+const MaxRequestsPerHour =
+ config.api.rateLimit.requests * (RateLimitTime / 1000)
const rateLimitOptions = {
windowMs: RateLimitTime, // Time window in milliseconds
@@ -97,17 +105,19 @@ app.use(express.json({ limit: '50mb' }))
app.use(express.static(path.join(__dirname, config.devOptions.clientPath)))
-app.use(session({
- name: 'discord',
- key: 'session',
- secret: config.api.sessionSecret,
- store: sessionStore,
- resave: true,
- saveUninitialized: false,
- cookie: { maxAge: 86400000 * config.api.cookieAgeDays },
-}))
-
-config.authentication.strategies.forEach(strategy => {
+app.use(
+ session({
+ name: 'discord',
+ key: 'session',
+ secret: config.api.sessionSecret,
+ store: sessionStore,
+ resave: true,
+ saveUninitialized: false,
+ cookie: { maxAge: 86400000 * config.api.cookieAgeDays },
+ }),
+)
+
+config.authentication.strategies.forEach((strategy) => {
if (strategy.enabled) {
require(`./strategies/${strategy.name}.js`)
console.log(`[AUTH] Strategy ${strategy.name} initialized`)
@@ -132,16 +142,23 @@ passport.deserializeUser(async (user, done) => {
}
})
-i18next.use(Backend).init({
- lng: 'en',
- fallbackLng: 'en',
- preload: config.map.localeSelection,
- ns: ['translation'],
- defaultNS: 'translation',
- backend: { loadPath: path.resolve(`${__dirname}/../../public/locales/{{lng}}/{{ns}}.json`) },
-}, (err, t) => {
- if (err) return console.error(err)
-})
+i18next.use(Backend).init(
+ {
+ lng: 'en',
+ fallbackLng: 'en',
+ preload: config.map.localeSelection,
+ ns: ['translation'],
+ defaultNS: 'translation',
+ backend: {
+ loadPath: path.resolve(
+ `${__dirname}/../../public/locales/{{lng}}/{{ns}}.json`,
+ ),
+ },
+ },
+ (err, t) => {
+ if (err) return console.error(err)
+ },
+)
app.use(rootRouter, requestRateLimiter)
@@ -151,31 +168,31 @@ app.use((err, req, res, next) => {
switch (err.message) {
case 'NoCodeProvided':
return res.redirect('/404')
- case 'Failed to fetch user\'s guilds':
+ case "Failed to fetch user's guilds":
return res.redirect('/login')
default:
return res.redirect('/')
}
})
-Db.determineType()
- .then(async () => {
- await Promise.all([
- Event.getUicons(config.icons.styles),
- Event.getMasterfile(),
- Event.getInvasions(),
- Event.getWebhooks(config),
- Event.setAvailable('gyms', 'Gym', Db),
- Event.setAvailable('pokestops', 'Pokestop', Db),
- Event.setAvailable('pokemon', 'Pokemon', Db),
- Event.setAvailable('nests', 'Nest', Db),
- ])
- .then(() => {
- Event.addAvailable()
- app.listen(config.port, config.interface, () => {
- console.log(`[INIT] Server is now listening at http://${config.interface}:${config.port}`)
- })
- })
+Db.determineType().then(async () => {
+ await Promise.all([
+ Event.getUicons(config.icons.styles),
+ Event.getMasterfile(),
+ Event.getInvasions(),
+ Event.getWebhooks(config),
+ Event.setAvailable('gyms', 'Gym', Db),
+ Event.setAvailable('pokestops', 'Pokestop', Db),
+ Event.setAvailable('pokemon', 'Pokemon', Db),
+ Event.setAvailable('nests', 'Nest', Db),
+ ]).then(() => {
+ Event.addAvailable()
+ app.listen(config.port, config.interface, () => {
+ console.log(
+ `[INIT] Server is now listening at http://${config.interface}:${config.port}`,
+ )
+ })
})
+})
module.exports = app
diff --git a/server/src/models/Badge.js b/server/src/models/Badge.js
index d40ca1d52..6a2c22655 100644
--- a/server/src/models/Badge.js
+++ b/server/src/models/Badge.js
@@ -1,6 +1,8 @@
const { Model } = require('objection')
const {
- database: { settings: { userTableName, gymBadgeTableName } },
+ database: {
+ settings: { userTableName, gymBadgeTableName },
+ },
} = require('../services/config')
module.exports = class Badge extends Model {
@@ -33,8 +35,6 @@ module.exports = class Badge extends Model {
}
static async getAll(userId) {
- return this.query()
- .where('userId', userId)
- .andWhere('badge', '>', 0)
+ return this.query().where('userId', userId).andWhere('badge', '>', 0)
}
}
diff --git a/server/src/models/Device.js b/server/src/models/Device.js
index 2bcdb8943..ebcc5d1ab 100644
--- a/server/src/models/Device.js
+++ b/server/src/models/Device.js
@@ -10,23 +10,21 @@ module.exports = class Device extends Model {
const { areaRestrictions } = perms
const query = this.query()
if (settings.isMad) {
- query.join('trs_status', 'settings_device.device_id', 'trs_status.device_id')
+ query
+ .join('trs_status', 'settings_device.device_id', 'trs_status.device_id')
.join('settings_area', 'trs_status.area_id', 'settings_area.area_id')
.select([
'settings_device.name AS id',
'settings_area.name AS instance_name',
'mode AS type',
- raw('UNIX_TIMESTAMP(lastProtoDateTime)')
- .as('last_seen'),
- raw('X(currentPos)')
- .as('last_lat'),
- raw('Y(currentPos)')
- .as('last_lon'),
- raw(true)
- .as('isMad'),
+ raw('UNIX_TIMESTAMP(lastProtoDateTime)').as('last_seen'),
+ raw('X(currentPos)').as('last_lat'),
+ raw('Y(currentPos)').as('last_lon'),
+ raw(true).as('isMad'),
])
} else {
- query.join('instance', 'device.instance_name', 'instance.name')
+ query
+ .join('instance', 'device.instance_name', 'instance.name')
.select(
'uuid AS id',
'last_seen',
@@ -34,10 +32,8 @@ module.exports = class Device extends Model {
'last_lon',
'type',
'instance_name',
- raw('json_extract(data, "$.area")')
- .as('route'),
- raw('json_extract(data, "$.radius")')
- .as('radius'),
+ raw('json_extract(data, "$.area")').as('route'),
+ raw('json_extract(data, "$.radius")').as('radius'),
)
}
if (areaRestrictions.length) {
diff --git a/server/src/models/Filters.js b/server/src/models/Filters.js
index ad4c4c280..c14d3f586 100644
--- a/server/src/models/Filters.js
+++ b/server/src/models/Filters.js
@@ -1,5 +1,9 @@
/* eslint-disable max-classes-per-file */
-const { api: { pvp: { leagues } } } = require('../services/config')
+const {
+ api: {
+ pvp: { leagues },
+ },
+} = require('../services/config')
class GenericFilter {
constructor(enabled, size) {
@@ -17,7 +21,13 @@ class PokemonFilter extends GenericFilter {
this.def_iv = def || [0, 15]
this.sta_iv = sta || [0, 15]
this.level = level || [1, 35]
- leagues.forEach(league => this[league.name] = pvp || [(league.minRank || 1), (league.maxRank || 100)])
+ leagues.forEach(
+ (league) =>
+ (this[league.name] = pvp || [
+ league.minRank || 1,
+ league.maxRank || 100,
+ ]),
+ )
}
}
diff --git a/server/src/models/Gym.js b/server/src/models/Gym.js
index b31b9dc07..051fec57c 100644
--- a/server/src/models/Gym.js
+++ b/server/src/models/Gym.js
@@ -6,15 +6,47 @@ const { Event } = require('../services/initialization')
const getAreaSql = require('../services/functions/getAreaSql')
const {
api: { searchResultsLimit, queryLimits, gymValidDataLimit, hideOldGyms },
- defaultFilters: { gyms: { baseTeamIds, baseGymSlotAmounts } },
+ defaultFilters: {
+ gyms: { baseTeamIds, baseGymSlotAmounts },
+ },
} = require('../services/config')
const Badge = require('./Badge')
-const coreFields = ['id', 'name', 'url', 'lat', 'lon', 'updated', 'last_modified_timestamp']
+const coreFields = [
+ 'id',
+ 'name',
+ 'url',
+ 'lat',
+ 'lon',
+ 'updated',
+ 'last_modified_timestamp',
+]
-const gymFields = ['available_slots', 'ex_raid_eligible', 'ar_scan_eligible', 'team_id', 'in_battle', 'guarding_pokemon_id', 'total_cp', 'power_up_points', 'power_up_level', 'power_up_end_timestamp']
+const gymFields = [
+ 'available_slots',
+ 'ex_raid_eligible',
+ 'ar_scan_eligible',
+ 'team_id',
+ 'in_battle',
+ 'guarding_pokemon_id',
+ 'total_cp',
+ 'power_up_points',
+ 'power_up_level',
+ 'power_up_end_timestamp',
+]
-const raidFields = ['raid_level', 'raid_battle_timestamp', 'raid_end_timestamp', 'raid_pokemon_id', 'raid_pokemon_form', 'raid_pokemon_gender', 'raid_pokemon_costume', 'raid_pokemon_evolution', 'raid_pokemon_move_1', 'raid_pokemon_move_2']
+const raidFields = [
+ 'raid_level',
+ 'raid_battle_timestamp',
+ 'raid_end_timestamp',
+ 'raid_pokemon_id',
+ 'raid_pokemon_form',
+ 'raid_pokemon_gender',
+ 'raid_pokemon_costume',
+ 'raid_pokemon_evolution',
+ 'raid_pokemon_move_1',
+ 'raid_pokemon_move_2',
+]
module.exports = class Gym extends Model {
static get tableName() {
@@ -22,15 +54,29 @@ module.exports = class Gym extends Model {
}
static async getAll(perms, args, { isMad, availableSlotsCol }, userId) {
- const { gyms: gymPerms, raids: raidPerms, areaRestrictions, gymBadges } = perms
const {
- onlyAllGyms, onlyRaids, onlyExEligible, onlyInBattle, onlyArEligible, onlyRaidTier, onlyGymBadges, onlyBadge, ts,
+ gyms: gymPerms,
+ raids: raidPerms,
+ areaRestrictions,
+ gymBadges,
+ } = perms
+ const {
+ onlyAllGyms,
+ onlyRaids,
+ onlyExEligible,
+ onlyInBattle,
+ onlyArEligible,
+ onlyRaidTier,
+ onlyGymBadges,
+ onlyBadge,
+ ts,
} = args.filters
- const safeTs = ts || Math.floor((new Date()).getTime() / 1000)
+ const safeTs = ts || Math.floor(new Date().getTime() / 1000)
const query = this.query()
if (isMad) {
- query.leftJoin('gymdetails', 'gym.gym_id', 'gymdetails.gym_id')
+ query
+ .leftJoin('gymdetails', 'gym.gym_id', 'gymdetails.gym_id')
.leftJoin('raid', 'gym.gym_id', 'raid.gym_id')
.select([
'gym.gym_id AS id',
@@ -53,22 +99,23 @@ module.exports = class Gym extends Model {
'evolution AS raid_pokemon_evolution',
'move_1 AS raid_pokemon_move_1',
'move_2 AS raid_pokemon_move_2',
- raw('UNIX_TIMESTAMP(last_modified)')
- .as('last_modified_timestamp'),
- raw('UNIX_TIMESTAMP(end)')
- .as('raid_end_timestamp'),
- raw('UNIX_TIMESTAMP(start)')
- .as('raid_battle_timestamp'),
- raw('UNIX_TIMESTAMP(gym.last_scanned)')
- .as('updated'),
+ raw('UNIX_TIMESTAMP(last_modified)').as('last_modified_timestamp'),
+ raw('UNIX_TIMESTAMP(end)').as('raid_end_timestamp'),
+ raw('UNIX_TIMESTAMP(start)').as('raid_battle_timestamp'),
+ raw('UNIX_TIMESTAMP(gym.last_scanned)').as('updated'),
])
if (hideOldGyms) {
- query.whereRaw(`UNIX_TIMESTAMP(gym.last_scanned) > ${Date.now() / 1000 - (gymValidDataLimit * 86400)}`)
+ query.whereRaw(
+ `UNIX_TIMESTAMP(gym.last_scanned) > ${
+ Date.now() / 1000 - gymValidDataLimit * 86400
+ }`,
+ )
}
} else if (hideOldGyms) {
- query.where('updated', '>', Date.now() / 1000 - (gymValidDataLimit * 86400))
+ query.where('updated', '>', Date.now() / 1000 - gymValidDataLimit * 86400)
}
- query.whereBetween(isMad ? 'latitude' : 'lat', [args.minLat, args.maxLat])
+ query
+ .whereBetween(isMad ? 'latitude' : 'lat', [args.minLat, args.maxLat])
.andWhereBetween(isMad ? 'longitude' : 'lon', [args.minLon, args.maxLon])
.andWhere(isMad ? 'enabled' : 'deleted', isMad)
@@ -77,38 +124,54 @@ module.exports = class Gym extends Model {
const teams = []
const eggs = []
const slots = []
- const actualBadge = onlyBadge === 'all' ? 'all' : onlyBadge && +onlyBadge.replace('badge_', '')
+ const actualBadge =
+ onlyBadge === 'all'
+ ? 'all'
+ : onlyBadge && +onlyBadge.replace('badge_', '')
- const userBadges = onlyGymBadges && gymBadges && userId
- ? await Badge.query()
- .where('userId', userId)
- .andWhere('badge', ...(actualBadge === 'all' ? ['>', 0] : [actualBadge]))
- : []
+ const userBadges =
+ onlyGymBadges && gymBadges && userId
+ ? await Badge.query()
+ .where('userId', userId)
+ .andWhere(
+ 'badge',
+ ...(actualBadge === 'all' ? ['>', 0] : [actualBadge]),
+ )
+ : []
- Object.keys(args.filters).forEach(gym => {
+ Object.keys(args.filters).forEach((gym) => {
switch (gym.charAt(0)) {
case 'r':
- case 'o': break
- case 'e': eggs.push(gym.slice(1)); break
- case 't': teams.push(gym.slice(1).split('-')[0]); break
- case 'g': slots.push({
- team: gym.slice(1).split('-')[0],
- slots: baseGymSlotAmounts.length - gym.slice(1).split('-')[1],
- }); break
- default: {
- const [id, form] = gym.split('-')
- raidBosses.add(id)
- raidForms.add(form)
- } break
+ case 'o':
+ break
+ case 'e':
+ eggs.push(gym.slice(1))
+ break
+ case 't':
+ teams.push(gym.slice(1).split('-')[0])
+ break
+ case 'g':
+ slots.push({
+ team: gym.slice(1).split('-')[0],
+ slots: baseGymSlotAmounts.length - gym.slice(1).split('-')[1],
+ })
+ break
+ default:
+ {
+ const [id, form] = gym.split('-')
+ raidBosses.add(id)
+ raidForms.add(form)
+ }
+ break
}
})
const finalTeams = []
- const finalSlots = Object.fromEntries(baseTeamIds.map(team => [team, []]))
+ const finalSlots = Object.fromEntries(baseTeamIds.map((team) => [team, []]))
- teams.forEach(team => {
+ teams.forEach((team) => {
let slotCount = 0
- slots.forEach(slot => {
+ slots.forEach((slot) => {
if (slot.team === team) {
slotCount += 1
finalSlots[team].push(+slot.slots)
@@ -120,13 +183,24 @@ module.exports = class Gym extends Model {
}
})
- if (!onlyArEligible && !onlyExEligible && !onlyInBattle && !userBadges.length) {
+ if (
+ !onlyArEligible &&
+ !onlyExEligible &&
+ !onlyInBattle &&
+ !userBadges.length
+ ) {
// Does some checks if no special filters are enabled
if (!onlyRaids && onlyAllGyms && !slots.length && !finalTeams.length) {
// Returns nothing if gyms are enabled but no teams are selected
return []
}
- if (!onlyAllGyms && onlyRaids && onlyRaidTier === 'all' && !raidBosses.size && !eggs.length) {
+ if (
+ !onlyAllGyms &&
+ onlyRaids &&
+ onlyRaidTier === 'all' &&
+ !raidBosses.size &&
+ !eggs.length
+ ) {
// Returns nothing if only raids are enabled without any filters
return []
}
@@ -136,19 +210,19 @@ module.exports = class Gym extends Model {
}
}
- query.andWhere(gym => {
+ query.andWhere((gym) => {
if (onlyExEligible && gymPerms) {
- gym.orWhere(ex => {
+ gym.orWhere((ex) => {
ex.where(isMad ? 'is_ex_raid_eligible' : 'ex_raid_eligible', 1)
})
}
if (onlyInBattle && gymPerms) {
- gym.orWhere(battle => {
+ gym.orWhere((battle) => {
battle.where(isMad ? 'is_in_battle' : 'in_battle', 1)
})
}
if (onlyArEligible && gymPerms) {
- gym.orWhere(ar => {
+ gym.orWhere((ar) => {
ar.where(isMad ? 'is_ar_scan_eligible' : 'ar_scan_eligible', 1)
})
}
@@ -159,52 +233,83 @@ module.exports = class Gym extends Model {
gym.orWhereNotNull('team_id')
} else {
if (finalTeams.length) {
- gym.orWhere(team => {
+ gym.orWhere((team) => {
team.whereIn('team_id', finalTeams)
})
}
Object.entries(finalSlots).forEach(([team, teamSlots]) => {
if (teamSlots.length) {
- gym.orWhere(gymSlot => {
- gymSlot.where('team_id', team)
- .whereIn(isMad ? 'slots_available' : availableSlotsCol, teamSlots)
+ gym.orWhere((gymSlot) => {
+ gymSlot
+ .where('team_id', team)
+ .whereIn(
+ isMad ? 'slots_available' : availableSlotsCol,
+ teamSlots,
+ )
})
}
})
}
}
if (userBadges.length) {
- gym.orWhereIn(isMad ? 'gym.gym_id' : 'id', userBadges.map(badge => badge.gymId))
+ gym.orWhereIn(
+ isMad ? 'gym.gym_id' : 'id',
+ userBadges.map((badge) => badge.gymId),
+ )
}
if (onlyRaids && raidPerms) {
if (onlyRaidTier === 'all') {
if (raidBosses.size) {
- gym.orWhere(raid => {
- raid.where(isMad ? 'end' : 'raid_end_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
- .whereIn(isMad ? 'pokemon_id' : 'raid_pokemon_id', [...raidBosses])
- .whereIn(isMad ? 'raid.form' : 'raid_pokemon_form', [...raidForms])
+ gym.orWhere((raid) => {
+ raid
+ .where(
+ isMad ? 'end' : 'raid_end_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
+ .whereIn(isMad ? 'pokemon_id' : 'raid_pokemon_id', [
+ ...raidBosses,
+ ])
+ .whereIn(isMad ? 'raid.form' : 'raid_pokemon_form', [
+ ...raidForms,
+ ])
})
}
if (eggs.length) {
- gym.orWhere(egg => {
+ gym.orWhere((egg) => {
if (eggs.length === 6) {
egg.where(isMad ? 'level' : 'raid_level', '>', 0)
} else {
egg.whereIn(isMad ? 'level' : 'raid_level', eggs)
}
- egg.andWhere(eggStatus => {
- eggStatus.where(isMad ? 'start' : 'raid_battle_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
- .orWhere(unknownEggs => {
- unknownEggs.where(isMad ? 'pokemon_id' : 'raid_pokemon_id', 0)
- .andWhere(isMad ? 'end' : 'raid_end_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
+ egg.andWhere((eggStatus) => {
+ eggStatus
+ .where(
+ isMad ? 'start' : 'raid_battle_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
+ .orWhere((unknownEggs) => {
+ unknownEggs
+ .where(isMad ? 'pokemon_id' : 'raid_pokemon_id', 0)
+ .andWhere(
+ isMad ? 'end' : 'raid_end_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
})
})
})
}
} else {
- gym.orWhere(raidTier => {
- raidTier.where(isMad ? 'level' : 'raid_level', onlyRaidTier)
- .andWhere(isMad ? 'end' : 'raid_end_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
+ gym.orWhere((raidTier) => {
+ raidTier
+ .where(isMad ? 'level' : 'raid_level', onlyRaidTier)
+ .andWhere(
+ isMad ? 'end' : 'raid_end_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
})
}
}
@@ -213,12 +318,16 @@ module.exports = class Gym extends Model {
getAreaSql(query, areaRestrictions, isMad)
}
- const secondaryFilter = queryResults => {
+ const secondaryFilter = (queryResults) => {
const filteredResults = []
- const userBadgeObj = Object.fromEntries(userBadges.map(b => [b.gymId, b.badge]))
+ const userBadgeObj = Object.fromEntries(
+ userBadges.map((b) => [b.gymId, b.badge]),
+ )
- queryResults.forEach(gym => {
- const newGym = Object.fromEntries(coreFields.map(field => [field, gym[field]]))
+ queryResults.forEach((gym) => {
+ const newGym = Object.fromEntries(
+ coreFields.map((field) => [field, gym[field]]),
+ )
const isRaid = gym.raid_end_timestamp > safeTs
const isEgg = isRaid && !gym.raid_pokemon_id
@@ -229,18 +338,29 @@ module.exports = class Gym extends Model {
if (gym.availble_slots !== undefined) {
gym.available_slots = gym.availble_slots
}
- if (gym.updated > Date.now() / 1000 - (gymValidDataLimit * 86400)) {
- gymFields.forEach(field => newGym[field] = gym[field])
+ if (gym.updated > Date.now() / 1000 - gymValidDataLimit * 86400) {
+ gymFields.forEach((field) => (newGym[field] = gym[field]))
}
}
- if (onlyRaids && raidPerms && (onlyRaidTier === 'all'
- ? (args.filters[`${gym.raid_pokemon_id}-${gym.raid_pokemon_form}`] && isRaid) || (args.filters[`e${gym.raid_level}`] && isEgg)
- : onlyRaidTier === gym.raid_level && (isRaid || isEgg))) {
- raidFields.forEach(field => newGym[field] = gym[field])
+ if (
+ onlyRaids &&
+ raidPerms &&
+ (onlyRaidTier === 'all'
+ ? (args.filters[
+ `${gym.raid_pokemon_id}-${gym.raid_pokemon_form}`
+ ] &&
+ isRaid) ||
+ (args.filters[`e${gym.raid_level}`] && isEgg)
+ : onlyRaidTier === gym.raid_level && (isRaid || isEgg))
+ ) {
+ raidFields.forEach((field) => (newGym[field] = gym[field]))
newGym.hasRaid = true
}
- if ((onlyAllGyms || onlyExEligible || onlyArEligible || onlyInBattle) && (finalTeams.includes(gym.team_id)
- || finalSlots[gym.team_id]?.includes(gym.available_slots))) {
+ if (
+ (onlyAllGyms || onlyExEligible || onlyArEligible || onlyInBattle) &&
+ (finalTeams.includes(gym.team_id) ||
+ finalSlots[gym.team_id]?.includes(gym.available_slots))
+ ) {
newGym.hasGym = true
}
if (newGym.hasRaid || newGym.badge || newGym.hasGym) {
@@ -253,7 +373,7 @@ module.exports = class Gym extends Model {
}
static async getAvailable({ isMad, availableSlotsCol }) {
- const ts = Math.floor((new Date()).getTime() / 1000)
+ const ts = Math.floor(new Date().getTime() / 1000)
const results = await this.query()
.select([
isMad ? 'pokemon_id AS raid_pokemon_id' : 'raid_pokemon_id',
@@ -261,7 +381,11 @@ module.exports = class Gym extends Model {
isMad ? 'level AS raid_level' : 'raid_level',
])
.from(isMad ? 'raid' : 'gym')
- .where(isMad ? 'end' : 'raid_end_timestamp', '>=', isMad ? this.knex().fn.now() : ts)
+ .where(
+ isMad ? 'end' : 'raid_end_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : ts,
+ )
.andWhere(isMad ? 'level' : 'raid_level', '>', 0)
.groupBy([
isMad ? 'pokemon_id' : 'raid_pokemon_id',
@@ -274,13 +398,10 @@ module.exports = class Gym extends Model {
'team_id AS team',
isMad ? 'slots_available AS slots' : `${availableSlotsCol} AS slots`,
])
- .groupBy([
- 'team_id',
- isMad ? 'slots_available' : availableSlotsCol,
- ])
+ .groupBy(['team_id', isMad ? 'slots_available' : availableSlotsCol])
.then((r) => {
const unique = new Set()
- r.forEach(result => {
+ r.forEach((result) => {
if (result.slots) {
unique.add(`g${result.team}-${result.slots}`)
} else {
@@ -290,15 +411,18 @@ module.exports = class Gym extends Model {
return [...unique]
})
if (!results.length) {
- return { available: [...teamResults, ...await fetchRaids()] }
+ return { available: [...teamResults, ...(await fetchRaids())] }
}
return {
- available: [...teamResults, ...results.flatMap(result => {
- if (result.raid_pokemon_id) {
- return `${result.raid_pokemon_id}-${result.raid_pokemon_form}`
- }
- return [`e${result.raid_level}`, `r${result.raid_level}`]
- })],
+ available: [
+ ...teamResults,
+ ...results.flatMap((result) => {
+ if (result.raid_pokemon_id) {
+ return `${result.raid_pokemon_id}-${result.raid_pokemon_form}`
+ }
+ return [`e${result.raid_level}`, `r${result.raid_level}`]
+ }),
+ ],
}
}
@@ -327,10 +451,10 @@ module.exports = class Gym extends Model {
static async searchRaids(perms, args, { isMad }, distance) {
const { search, locale } = args
- const pokemonIds = Object.keys(Event.masterfile.pokemon).filter(pkmn => (
- i18next.t(`poke_${pkmn}`, { lng: locale }).toLowerCase().includes(search)
- ))
- const safeTs = args.ts || Math.floor((new Date()).getTime() / 1000)
+ const pokemonIds = Object.keys(Event.masterfile.pokemon).filter((pkmn) =>
+ i18next.t(`poke_${pkmn}`, { lng: locale }).toLowerCase().includes(search),
+ )
+ const safeTs = args.ts || Math.floor(new Date().getTime() / 1000)
const query = this.query()
.select([
'name',
@@ -341,17 +465,28 @@ module.exports = class Gym extends Model {
isMad ? 'raid.form AS raid_pokemon_form' : 'raid_pokemon_form',
isMad ? 'raid.gender AS raid_pokemon_gender' : 'raid_pokemon_gender',
isMad ? 'raid.costume AS raid_pokemon_costume' : 'raid_pokemon_costume',
- isMad ? 'evolution AS raid_pokemon_evolution' : 'raid_pokemon_evolution',
+ isMad
+ ? 'evolution AS raid_pokemon_evolution'
+ : 'raid_pokemon_evolution',
distance,
])
.whereIn(isMad ? 'pokemon_id' : 'raid_pokemon_id', pokemonIds)
.limit(searchResultsLimit)
.orderBy('distance')
- .andWhere(isMad ? 'start' : 'raid_battle_timestamp', '<=', isMad ? this.knex().fn.now() : safeTs)
- .andWhere(isMad ? 'end' : 'raid_end_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
+ .andWhere(
+ isMad ? 'start' : 'raid_battle_timestamp',
+ '<=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
+ .andWhere(
+ isMad ? 'end' : 'raid_end_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
.andWhere(isMad ? 'enabled' : 'deleted', isMad)
if (isMad) {
- query.leftJoin('gymdetails', 'gym.gym_id', 'gymdetails.gym_id')
+ query
+ .leftJoin('gymdetails', 'gym.gym_id', 'gymdetails.gym_id')
.leftJoin('raid', 'gym.gym_id', 'raid.gym_id')
}
if (perms.areaRestrictions?.length) {
@@ -361,27 +496,28 @@ module.exports = class Gym extends Model {
}
static async getBadges(userGyms, _, { isMad }) {
- const query = this.query()
- .select([
- '*',
- isMad ? 'gym.gym_id AS id' : 'gym.id',
- isMad ? 'latitude AS lat' : 'lat',
- isMad ? 'longitude AS lon' : 'lon',
- isMad ? 'enabled' : 'deleted',
- ])
+ const query = this.query().select([
+ '*',
+ isMad ? 'gym.gym_id AS id' : 'gym.id',
+ isMad ? 'latitude AS lat' : 'lat',
+ isMad ? 'longitude AS lon' : 'lon',
+ isMad ? 'enabled' : 'deleted',
+ ])
if (isMad) {
query.leftJoin('gymdetails', 'gym.gym_id', 'gymdetails.gym_id')
}
- const results = await query
- .whereIn(isMad ? 'gym.gym_id' : 'gym.id', userGyms.map(gym => gym.gymId))
+ const results = await query.whereIn(
+ isMad ? 'gym.gym_id' : 'gym.id',
+ userGyms.map((gym) => gym.gymId),
+ )
return results
- .map(gym => {
+ .map((gym) => {
if (typeof gym.enabled === 'boolean') {
gym.deleted = !gym.enabled
}
- const gymBadge = userGyms.find(userGym => userGym.gymId === gym.id)
+ const gymBadge = userGyms.find((userGym) => userGym.gymId === gym.id)
if (gymBadge) {
gym.badge = gymBadge.badge
@@ -406,21 +542,21 @@ module.exports = class Gym extends Model {
static getSubmissions(args, { isMad }) {
const query = this.query()
- .whereBetween(`lat${isMad ? 'itude' : ''}`, [args.minLat - 0.025, args.maxLat + 0.025])
- .andWhereBetween(`lon${isMad ? 'gitude' : ''}`, [args.minLon - 0.025, args.maxLon + 0.025])
+ .whereBetween(`lat${isMad ? 'itude' : ''}`, [
+ args.minLat - 0.025,
+ args.maxLat + 0.025,
+ ])
+ .andWhereBetween(`lon${isMad ? 'gitude' : ''}`, [
+ args.minLon - 0.025,
+ args.maxLon + 0.025,
+ ])
.andWhere(isMad ? 'enabled' : 'deleted', isMad)
if (isMad) {
- query.select([
- 'gym_id AS id',
- 'latitude AS lat',
- 'longitude AS lon',
- ])
+ query.select(['gym_id AS id', 'latitude AS lat', 'longitude AS lon'])
} else {
- query.select(['id', 'lat', 'lon'])
- .andWhere(poi => {
- poi.whereNull('sponsor_id')
- .orWhere('sponsor_id', 0)
- })
+ query.select(['id', 'lat', 'lon']).andWhere((poi) => {
+ poi.whereNull('sponsor_id').orWhere('sponsor_id', 0)
+ })
}
return query
}
diff --git a/server/src/models/Nest.js b/server/src/models/Nest.js
index ce61f6dde..89b4ce92c 100644
--- a/server/src/models/Nest.js
+++ b/server/src/models/Nest.js
@@ -4,7 +4,9 @@ const { Event } = require('../services/initialization')
const getAreaSql = require('../services/functions/getAreaSql')
const {
api: { searchResultsLimit, queryLimits },
- defaultFilters: { nests: { avgFilter } },
+ defaultFilters: {
+ nests: { avgFilter },
+ },
} = require('../services/config')
const fetchNests = require('../services/api/fetchNests')
@@ -20,7 +22,7 @@ module.exports = class Nest extends Model {
static async getAll(perms, args) {
const { areaRestrictions } = perms
const pokemon = []
- Object.keys(args.filters).forEach(pkmn => {
+ Object.keys(args.filters).forEach((pkmn) => {
if (!pkmn.startsWith('o')) {
pokemon.push(pkmn.split('-')[0])
}
@@ -38,9 +40,9 @@ module.exports = class Nest extends Model {
}
const results = await query.limit(queryLimits.nests)
- const fixedForms = queryResults => {
+ const fixedForms = (queryResults) => {
const returnedResults = []
- queryResults.forEach(pkmn => {
+ queryResults.forEach((pkmn) => {
if (pkmn.pokemon_form == 0 || pkmn.pokemon_form === null) {
const formId = Event.masterfile.pokemon[pkmn.pokemon_id].defaultFormId
if (formId) pkmn.pokemon_form = formId
@@ -61,20 +63,24 @@ module.exports = class Nest extends Model {
.orderBy('pokemon_id', 'asc')
return {
- available: results.length ? results.map(pokemon => {
- if (pokemon.pokemon_form == 0 || pokemon.pokemon_form === null) {
- return `${pokemon.pokemon_id}-${Event.masterfile.pokemon[pokemon.pokemon_id].defaultFormId || 0}`
- }
- return `${pokemon.pokemon_id}-${pokemon.pokemon_form || 0}`
- }) : fetchNests(),
+ available: results.length
+ ? results.map((pokemon) => {
+ if (pokemon.pokemon_form == 0 || pokemon.pokemon_form === null) {
+ return `${pokemon.pokemon_id}-${
+ Event.masterfile.pokemon[pokemon.pokemon_id].defaultFormId || 0
+ }`
+ }
+ return `${pokemon.pokemon_id}-${pokemon.pokemon_form || 0}`
+ })
+ : fetchNests(),
}
}
static async search(perms, args, { isMad }, distance) {
const { search, locale } = args
- const pokemonIds = Object.keys(Event.masterfile.pokemon).filter(pkmn => (
- i18next.t(`poke_${pkmn}`, { lng: locale }).toLowerCase().includes(search)
- ))
+ const pokemonIds = Object.keys(Event.masterfile.pokemon).filter((pkmn) =>
+ i18next.t(`poke_${pkmn}`, { lng: locale }).toLowerCase().includes(search),
+ )
const query = this.query()
.select([
'nest_id AS id',
diff --git a/server/src/models/Pokemon.js b/server/src/models/Pokemon.js
index 76d387098..616bdc5cd 100644
--- a/server/src/models/Pokemon.js
+++ b/server/src/models/Pokemon.js
@@ -4,14 +4,26 @@ const { Model, raw, ref } = require('objection')
const { Event } = require('../services/initialization')
const legacyFilter = require('../services/legacyFilter')
const {
- api: { pvp: { minCp: pvpMinCp, leagues, reactMapHandlesPvp, leagueObj }, queryLimits },
+ api: {
+ pvp: { minCp: pvpMinCp, leagues, reactMapHandlesPvp, leagueObj },
+ queryLimits,
+ },
} = require('../services/config')
const getAreaSql = require('../services/functions/getAreaSql')
const { Pvp } = require('../services/initialization')
-const levelCalc = 'IFNULL(IF(cp_multiplier < 0.734, ROUND(58.35178527 * cp_multiplier * cp_multiplier - 2.838007664 * cp_multiplier + 0.8539209906), ROUND(171.0112688 * cp_multiplier - 95.20425243)), NULL)'
-const ivCalc = 'IFNULL((individual_attack + individual_defense + individual_stamina) / 0.45, NULL)'
-const keys = ['iv', 'level', 'atk_iv', 'def_iv', 'sta_iv', ...leagues.map(league => league.name)]
+const levelCalc =
+ 'IFNULL(IF(cp_multiplier < 0.734, ROUND(58.35178527 * cp_multiplier * cp_multiplier - 2.838007664 * cp_multiplier + 0.8539209906), ROUND(171.0112688 * cp_multiplier - 95.20425243)), NULL)'
+const ivCalc =
+ 'IFNULL((individual_attack + individual_defense + individual_stamina) / 0.45, NULL)'
+const keys = [
+ 'iv',
+ 'level',
+ 'atk_iv',
+ 'def_iv',
+ 'sta_iv',
+ ...leagues.map((league) => league.name),
+]
const madKeys = {
iv: raw(ivCalc),
level: raw(levelCalc),
@@ -20,14 +32,17 @@ const madKeys = {
sta_iv: 'individual_stamina',
}
-const getMadSql = q => (
- q.leftJoin('trs_spawn', 'pokemon.spawnpoint_id', 'trs_spawn.spawnpoint')
- .leftJoin('pokemon_display', 'pokemon.encounter_id', 'pokemon_display.encounter_id')
+const getMadSql = (q) =>
+ q
+ .leftJoin('trs_spawn', 'pokemon.spawnpoint_id', 'trs_spawn.spawnpoint')
+ .leftJoin(
+ 'pokemon_display',
+ 'pokemon.encounter_id',
+ 'pokemon_display.encounter_id',
+ )
.select([
'*',
- ref('pokemon.encounter_id')
- .castTo('CHAR')
- .as('id'),
+ ref('pokemon.encounter_id').castTo('CHAR').as('id'),
'pokemon.latitude AS lat',
'pokemon.longitude AS lon',
'individual_attack AS atk_iv',
@@ -40,18 +55,14 @@ const getMadSql = q => (
'pokemon_display.pokemon AS display_pokemon_id',
'pokemon_display.form AS ditto_form',
'weather_boosted_condition AS weather',
- raw('IF(calc_endminsec IS NOT NULL, 1, NULL)')
- .as('expire_timestamp_verified'),
- raw('Unix_timestamp(disappear_time)')
- .as('expire_timestamp'),
- raw('Unix_timestamp(last_modified)')
- .as('updated'),
- raw(ivCalc)
- .as('iv'),
- raw(levelCalc)
- .as('level'),
+ raw('IF(calc_endminsec IS NOT NULL, 1, NULL)').as(
+ 'expire_timestamp_verified',
+ ),
+ raw('Unix_timestamp(disappear_time)').as('expire_timestamp'),
+ raw('Unix_timestamp(last_modified)').as('updated'),
+ raw(ivCalc).as('iv'),
+ raw(levelCalc).as('level'),
])
-)
module.exports = class Pokemon extends Model {
static get tableName() {
@@ -59,18 +70,26 @@ module.exports = class Pokemon extends Model {
}
static async getAll(perms, args, { isMad, pvpV2 }) {
+ const { iv: ivs, pvp, areaRestrictions } = perms
const {
- iv: ivs, pvp, areaRestrictions,
- } = perms
- const {
- onlyStandard, onlyIvOr, onlyXlKarp, onlyXsRat, onlyZeroIv, onlyHundoIv, onlyPvpMega, onlyLinkGlobal, ts,
+ onlyStandard,
+ onlyIvOr,
+ onlyXlKarp,
+ onlyXsRat,
+ onlyZeroIv,
+ onlyHundoIv,
+ onlyPvpMega,
+ onlyLinkGlobal,
+ ts,
} = args.filters
let queryPvp = false
const safeTs = ts || Math.floor(Date.now() / 1000)
// quick check to make sure no Pokemon are returned when none are enabled for users with only Pokemon perms
if (!ivs && !pvp) {
- const noPokemonSelect = Object.keys(args.filters).find(x => x.charAt(0) !== 'o')
+ const noPokemonSelect = Object.keys(args.filters).find(
+ (x) => x.charAt(0) !== 'o',
+ )
if (!noPokemonSelect) return []
}
@@ -78,14 +97,17 @@ module.exports = class Pokemon extends Model {
const rankCheck = pkmn.rank <= max && pkmn.rank >= min
const cpCheck = pvpV2 || reactMapHandlesPvp || pkmn.cp >= pvpMinCp[league]
const megaCheck = !pkmn.evolution || onlyPvpMega
- const capCheck = pvpV2 || reactMapHandlesPvp ? pkmn.capped || args.filters[`onlyPvp${pkmn.cap}`] : true
+ const capCheck =
+ pvpV2 || reactMapHandlesPvp
+ ? pkmn.capped || args.filters[`onlyPvp${pkmn.cap}`]
+ : true
return rankCheck && cpCheck && megaCheck && capCheck
}
const getRanks = (league, data, filterId) => {
const [min, max] = getMinMax(filterId, league)
let best = 4096
- const filtered = data.filter(pkmn => {
+ const filtered = data.filter((pkmn) => {
const valid = pvpCheck(pkmn, league, min, max)
if (valid && pkmn.rank < best) best = pkmn.rank
return valid
@@ -122,7 +144,7 @@ module.exports = class Pokemon extends Model {
const parsed = {}
const pvpKeys = ['great', 'ultra']
- pvpKeys.forEach(league => {
+ pvpKeys.forEach((league) => {
if (pokemon[`pvp_rankings_${league}_league`]) {
parsed[league] = JSON.parse(pokemon[`pvp_rankings_${league}_league`])
}
@@ -131,12 +153,13 @@ module.exports = class Pokemon extends Model {
}
// checks if filters are set to default and skips them if so
- const arrayCheck = (filter, key) => filter[key]?.every((v, i) => v === onlyStandard[key][i])
+ const arrayCheck = (filter, key) =>
+ filter[key]?.every((v, i) => v === onlyStandard[key][i])
// cycles through the above arrayCheck
- const getRelevantKeys = filter => {
+ const getRelevantKeys = (filter) => {
const relevantKeys = []
- keys.forEach(key => {
+ keys.forEach((key) => {
if (!arrayCheck(filter, key)) {
relevantKeys.push(key)
}
@@ -146,7 +169,7 @@ module.exports = class Pokemon extends Model {
// generates specific SQL for each slider that isn't set to default, along with perm checks
const generateSql = (queryBase, filter, relevant) => {
- relevant.forEach(key => {
+ relevant.forEach((key) => {
switch (key) {
case 'level':
case 'atk_iv':
@@ -155,43 +178,58 @@ module.exports = class Pokemon extends Model {
case 'iv':
if (ivs) {
queryBase.andWhereBetween(isMad ? madKeys[key] : key, filter[key])
- } break
+ }
+ break
default:
if (pvp) {
queryPvp = true
- if (!relevant.includes('iv')
- && !relevant.includes('level')
- && !relevant.includes('atk_iv')
- && !relevant.includes('def_iv')
- && !relevant.includes('sta_iv')) {
+ if (
+ !relevant.includes('iv') &&
+ !relevant.includes('level') &&
+ !relevant.includes('atk_iv') &&
+ !relevant.includes('def_iv') &&
+ !relevant.includes('sta_iv')
+ ) {
// doesn't return everything if only pvp stats for individual pokemon
queryBase.whereNull('pokemon_id')
}
- } break
+ }
+ break
}
})
}
- const globalCheck = (pkmn) => onlyLinkGlobal ? args.filters[`${pkmn.pokemon_id}-${pkmn.form}`] : true
+ const globalCheck = (pkmn) =>
+ onlyLinkGlobal ? args.filters[`${pkmn.pokemon_id}-${pkmn.form}`] : true
// query builder
const query = this.query()
if (isMad) {
getMadSql(query)
}
- query.where(isMad ? 'disappear_time' : 'expire_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
- .andWhereBetween(isMad ? 'pokemon.latitude' : 'lat', [args.minLat, args.maxLat])
- .andWhereBetween(isMad ? 'pokemon.longitude' : 'lon', [args.minLon, args.maxLon])
- .andWhere(ivOr => {
+ query
+ .where(
+ isMad ? 'disappear_time' : 'expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
+ .andWhereBetween(isMad ? 'pokemon.latitude' : 'lat', [
+ args.minLat,
+ args.maxLat,
+ ])
+ .andWhereBetween(isMad ? 'pokemon.longitude' : 'lon', [
+ args.minLon,
+ args.maxLon,
+ ])
+ .andWhere((ivOr) => {
for (const [pkmn, filter] of Object.entries(args.filters)) {
if (pkmn.includes('-')) {
const relevantFilters = getRelevantKeys(filter)
const [id, form] = pkmn.split('-')
- ivOr.orWhere(poke => {
+ ivOr.orWhere((poke) => {
if (id === '132') {
poke.where('pokemon_id', id)
} else {
- poke.where('pokemon_id', id)
- .andWhere('pokemon.form', form)
+ poke.where('pokemon_id', id).andWhere('pokemon.form', form)
}
if (relevantFilters.length) {
generateSql(poke, filter, relevantFilters, true)
@@ -207,12 +245,10 @@ module.exports = class Pokemon extends Model {
}
}
if (onlyXlKarp) {
- ivOr.orWhere('pokemon_id', 129)
- .andWhere('weight', '>=', 13.125)
+ ivOr.orWhere('pokemon_id', 129).andWhere('weight', '>=', 13.125)
}
if (onlyXsRat) {
- ivOr.orWhere('pokemon_id', 19)
- .andWhere('weight', '<=', 2.40625)
+ ivOr.orWhere('pokemon_id', 19).andWhere('weight', '<=', 2.40625)
}
if (onlyZeroIv && ivs) {
ivOr.orWhere(isMad ? raw(ivCalc) : 'iv', 0)
@@ -231,7 +267,7 @@ module.exports = class Pokemon extends Model {
const listOfIds = []
// form checker
- results.forEach(pkmn => {
+ results.forEach((pkmn) => {
let noPvp = true
if (pkmn.pokemon_id === 132 && !pkmn.ditto_form) {
pkmn.ditto_form = pkmn.form
@@ -244,10 +280,13 @@ module.exports = class Pokemon extends Model {
pkmn.seen_type = 'encounter'
}
}
- if (pvp && ((pkmn.pvp_rankings_great_league
- || pkmn.pvp_rankings_ultra_league
- || pkmn.pvp)
- || (isMad && reactMapHandlesPvp && pkmn.cp))) {
+ if (
+ pvp &&
+ (pkmn.pvp_rankings_great_league ||
+ pkmn.pvp_rankings_ultra_league ||
+ pkmn.pvp ||
+ (isMad && reactMapHandlesPvp && pkmn.cp))
+ ) {
noPvp = false
listOfIds.push(pkmn.id)
pvpResults.push(pkmn)
@@ -266,11 +305,24 @@ module.exports = class Pokemon extends Model {
} else {
pvpQuery.select(['*', raw(true).as('pvpCheck')])
}
- pvpQuery.where(isMad ? 'disappear_time' : 'expire_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
- .andWhereBetween(isMad ? 'pokemon.latitude' : 'lat', [args.minLat, args.maxLat])
- .andWhereBetween(isMad ? 'pokemon.longitude' : 'lon', [args.minLon, args.maxLon])
+ pvpQuery
+ .where(
+ isMad ? 'disappear_time' : 'expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
+ .andWhereBetween(isMad ? 'pokemon.latitude' : 'lat', [
+ args.minLat,
+ args.maxLat,
+ ])
+ .andWhereBetween(isMad ? 'pokemon.longitude' : 'lon', [
+ args.minLon,
+ args.maxLon,
+ ])
if (isMad && listOfIds.length) {
- pvpQuery.whereRaw(`pokemon.encounter_id NOT IN ( ${listOfIds.join(',')} )`)
+ pvpQuery.whereRaw(
+ `pokemon.encounter_id NOT IN ( ${listOfIds.join(',')} )`,
+ )
} else {
pvpQuery.whereNotIn('id', listOfIds)
}
@@ -279,19 +331,22 @@ module.exports = class Pokemon extends Model {
} else if (pvpV2) {
pvpQuery.whereNotNull('pvp')
} else {
- pvpQuery.andWhere(pvpBuilder => {
- pvpBuilder.whereNotNull('pvp_rankings_great_league')
+ pvpQuery.andWhere((pvpBuilder) => {
+ pvpBuilder
+ .whereNotNull('pvp_rankings_great_league')
.orWhereNotNull('pvp_rankings_ultra_league')
})
}
if (areaRestrictions?.length) {
getAreaSql(pvpQuery, areaRestrictions, isMad, 'pokemon')
}
- pvpResults.push(...await pvpQuery.limit(queryLimits.pokemonPvp - results.length))
+ pvpResults.push(
+ ...(await pvpQuery.limit(queryLimits.pokemonPvp - results.length)),
+ )
}
// filter pokes with pvp data
- pvpResults.forEach(pkmn => {
+ pvpResults.forEach((pkmn) => {
const parsed = reactMapHandlesPvp
? Pvp.resultWithCache(pkmn, safeTs)
: getParsedPvp(pkmn)
@@ -303,7 +358,7 @@ module.exports = class Pokemon extends Model {
pkmn.form = Event.masterfile.pokemon[pkmn.pokemon_id].defaultFormId
}
if (!pkmn.seen_type) pkmn.seen_type = 'encounter'
- Object.keys(parsed).forEach(league => {
+ Object.keys(parsed).forEach((league) => {
if (leagueObj[league]) {
const { filtered, best } = getRanks(league, parsed[league], filterId)
if (filtered.length) {
@@ -312,7 +367,10 @@ module.exports = class Pokemon extends Model {
}
}
})
- if ((Object.keys(pkmn.cleanPvp).length || !pkmn.pvpCheck) && globalCheck(pkmn)) {
+ if (
+ (Object.keys(pkmn.cleanPvp).length || !pkmn.pvpCheck) &&
+ globalCheck(pkmn)
+ ) {
finalResults.push(pkmn)
}
})
@@ -320,11 +378,21 @@ module.exports = class Pokemon extends Model {
}
static async getLegacy(perms, args, { isMad }) {
- const ts = Math.floor((new Date()).getTime() / 1000)
+ const ts = Math.floor(new Date().getTime() / 1000)
const query = this.query()
- .where(isMad ? 'disappear_time' : 'expire_timestamp', '>=', isMad ? this.knex().fn.now() : ts)
- .andWhereBetween(isMad ? 'pokemon.latitude' : 'lat', [args.minLat, args.maxLat])
- .andWhereBetween(isMad ? 'pokemon.longitude' : 'lon', [args.minLon, args.maxLon])
+ .where(
+ isMad ? 'disappear_time' : 'expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : ts,
+ )
+ .andWhereBetween(isMad ? 'pokemon.latitude' : 'lat', [
+ args.minLat,
+ args.maxLat,
+ ])
+ .andWhereBetween(isMad ? 'pokemon.longitude' : 'lon', [
+ args.minLon,
+ args.maxLon,
+ ])
if (isMad) {
getMadSql(query)
}
@@ -336,13 +404,19 @@ module.exports = class Pokemon extends Model {
}
static async getAvailable({ isMad }) {
- const ts = Math.floor((new Date()).getTime() / 1000)
+ const ts = Math.floor(new Date().getTime() / 1000)
const results = await this.query()
.select('pokemon_id', 'form')
- .where(isMad ? 'disappear_time' : 'expire_timestamp', '>=', isMad ? this.knex().fn.now() : ts)
+ .where(
+ isMad ? 'disappear_time' : 'expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : ts,
+ )
.groupBy('pokemon_id', 'form')
.orderBy('pokemon_id', 'form')
- return { available: results.map(pkmn => `${pkmn.pokemon_id}-${pkmn.form}`) }
+ return {
+ available: results.map((pkmn) => `${pkmn.pokemon_id}-${pkmn.form}`),
+ }
}
static getOne(id, { isMad }) {
diff --git a/server/src/models/Pokestop.js b/server/src/models/Pokestop.js
index aec882d4d..dd593b941 100644
--- a/server/src/models/Pokestop.js
+++ b/server/src/models/Pokestop.js
@@ -5,7 +5,12 @@ const { Event } = require('../services/initialization')
const fetchQuests = require('../services/api/fetchQuests')
const getAreaSql = require('../services/functions/getAreaSql')
const {
- api: { searchResultsLimit, queryLimits, stopValidDataLimit, hideOldPokestops },
+ api: {
+ searchResultsLimit,
+ queryLimits,
+ stopValidDataLimit,
+ hideOldPokestops,
+ },
database: { settings },
map,
} = require('../services/config')
@@ -31,7 +36,7 @@ const madQuestProps = {
with_ar: true,
stardust_amount: true,
}
-Object.keys(questProps).forEach(key => {
+Object.keys(questProps).forEach((key) => {
questPropsAlt[`alternative_${key}`] = true
madQuestProps[key] = true
})
@@ -45,22 +50,43 @@ module.exports = class Pokestop extends Model {
return 'pokestop'
}
- static async getAll(perms, args, { isMad, hasAltQuests, hasMultiInvasions, multiInvasionMs, hasRewardAmount }) {
- const { filters: {
- onlyLures, onlyQuests, onlyInvasions, onlyArEligible, onlyAllPokestops,
- }, ts, midnight: clientMidnight } = args
- const midnight = settings.hideOldQuests
- ? clientMidnight || 0
- : 0
- const safeTs = ts || Math.floor((new Date()).getTime() / 1000)
+ static async getAll(
+ perms,
+ args,
+ {
+ isMad,
+ hasAltQuests,
+ hasMultiInvasions,
+ multiInvasionMs,
+ hasRewardAmount,
+ },
+ ) {
+ const {
+ filters: {
+ onlyLures,
+ onlyQuests,
+ onlyInvasions,
+ onlyArEligible,
+ onlyAllPokestops,
+ },
+ ts,
+ midnight: clientMidnight,
+ } = args
+ const midnight = settings.hideOldQuests ? clientMidnight || 0 : 0
+ const safeTs = ts || Math.floor(new Date().getTime() / 1000)
const {
- lures: lurePerms, quests: questPerms, invasions: invasionPerms, pokestops: pokestopPerms, areaRestrictions,
+ lures: lurePerms,
+ quests: questPerms,
+ invasions: invasionPerms,
+ pokestops: pokestopPerms,
+ areaRestrictions,
} = perms
const query = this.query()
if (isMad) {
- query.leftJoin('trs_quest', 'pokestop.pokestop_id', 'trs_quest.GUID')
+ query
+ .leftJoin('trs_quest', 'pokestop.pokestop_id', 'trs_quest.GUID')
.select([
'*',
'pokestop_id AS id',
@@ -75,38 +101,50 @@ module.exports = class Pokestop extends Model {
'quest_reward AS quest_rewards',
'quest_pokemon_form_id AS quest_form_id',
'quest_pokemon_costume_id AS quest_costume_id',
- raw('UNIX_TIMESTAMP(last_modified)')
- .as('last_modified_timestamp'),
- raw('UNIX_TIMESTAMP(lure_expiration)')
- .as('lure_expire_timestamp'),
- raw('UNIX_TIMESTAMP(last_updated)')
- .as('updated'),
- raw('UNIX_TIMESTAMP(incident_expiration)')
- .as('incident_expire_timestamp'),
+ raw('UNIX_TIMESTAMP(last_modified)').as('last_modified_timestamp'),
+ raw('UNIX_TIMESTAMP(lure_expiration)').as('lure_expire_timestamp'),
+ raw('UNIX_TIMESTAMP(last_updated)').as('updated'),
+ raw('UNIX_TIMESTAMP(incident_expiration)').as(
+ 'incident_expire_timestamp',
+ ),
])
if (hideOldPokestops) {
- query.whereRaw(`UNIX_TIMESTAMP(last_updated) > ${Date.now() / 1000 - (stopValidDataLimit * 86400)}`)
+ query.whereRaw(
+ `UNIX_TIMESTAMP(last_updated) > ${
+ Date.now() / 1000 - stopValidDataLimit * 86400
+ }`,
+ )
}
} else if (hideOldPokestops) {
- query.where('pokestop.updated', '>', Date.now() / 1000 - (stopValidDataLimit * 86400))
+ query.where(
+ 'pokestop.updated',
+ '>',
+ Date.now() / 1000 - stopValidDataLimit * 86400,
+ )
}
if (hasMultiInvasions) {
- query.leftJoin('incident', 'pokestop.id', 'incident.pokestop_id')
+ query
+ .leftJoin('incident', 'pokestop.id', 'incident.pokestop_id')
.select([
'*',
'pokestop.updated',
'pokestop.id AS id',
'incident.id AS incidentId',
- raw(multiInvasionMs
- ? 'FLOOR(incident.updated_ms / 1000) AS incident_updated'
- : 'incident.updated AS incident_updated'),
- raw(multiInvasionMs
- ? 'FLOOR(incident.expiration_ms / 1000) AS incident_expire_timestamp'
- : 'incident.expiration AS incident_expire_timestamp'),
+ raw(
+ multiInvasionMs
+ ? 'FLOOR(incident.updated_ms / 1000) AS incident_updated'
+ : 'incident.updated AS incident_updated',
+ ),
+ raw(
+ multiInvasionMs
+ ? 'FLOOR(incident.expiration_ms / 1000) AS incident_expire_timestamp'
+ : 'incident.expiration AS incident_expire_timestamp',
+ ),
'incident.character AS grunt_type',
])
}
- query.whereBetween(isMad ? 'latitude' : 'lat', [args.minLat, args.maxLat])
+ query
+ .whereBetween(isMad ? 'latitude' : 'lat', [args.minLat, args.maxLat])
.andWhereBetween(isMad ? 'longitude' : 'lon', [args.minLon, args.maxLon])
.andWhere(isMad ? 'enabled' : 'deleted', isMad)
if (areaRestrictions?.length) {
@@ -125,152 +163,266 @@ module.exports = class Pokestop extends Model {
const xlCandy = []
const general = []
// preps arrays for interested objects
- Object.keys(args.filters).forEach(pokestop => {
+ Object.keys(args.filters).forEach((pokestop) => {
switch (pokestop.charAt(0)) {
- case 'o': break
- case 'd': stardust.push(pokestop.slice(1).split('-')[0]); break
- case 'i': invasions.push(pokestop.slice(1)); break
- case 'l': lures.push(pokestop.slice(1)); break
- case 'm': energy.push(pokestop.slice(1)); break
- case 'q': items.push(pokestop.slice(1)); break
- case 'c': candy.push(pokestop.slice(1)); break
- case 'x': xlCandy.push(pokestop.slice(1)); break
- case 'u': general.push(pokestop.slice(1)); break
- default: pokemon.push(pokestop.split('-')[0]); break
+ case 'o':
+ break
+ case 'd':
+ stardust.push(pokestop.slice(1).split('-')[0])
+ break
+ case 'i':
+ invasions.push(pokestop.slice(1))
+ break
+ case 'l':
+ lures.push(pokestop.slice(1))
+ break
+ case 'm':
+ energy.push(pokestop.slice(1))
+ break
+ case 'q':
+ items.push(pokestop.slice(1))
+ break
+ case 'c':
+ candy.push(pokestop.slice(1))
+ break
+ case 'x':
+ xlCandy.push(pokestop.slice(1))
+ break
+ case 'u':
+ general.push(pokestop.slice(1))
+ break
+ default:
+ pokemon.push(pokestop.split('-')[0])
+ break
}
})
// builds the query
- query.andWhere(stops => {
+ query.andWhere((stops) => {
if (onlyLures && lurePerms) {
- stops.orWhere(lure => {
- lure.whereIn(isMad ? 'active_fort_modifier' : 'lure_id', lures)
- .andWhere(isMad ? 'lure_expiration' : 'lure_expire_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
+ stops.orWhere((lure) => {
+ lure
+ .whereIn(isMad ? 'active_fort_modifier' : 'lure_id', lures)
+ .andWhere(
+ isMad ? 'lure_expiration' : 'lure_expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
})
}
if (onlyQuests && questPerms) {
- stops.orWhere(quest => {
- quest.where(timestamps => {
+ stops.orWhere((quest) => {
+ quest.where((timestamps) => {
timestamps.where('quest_timestamp', '>=', midnight)
if (hasAltQuests) {
- timestamps.orWhere('alternative_quest_timestamp', '>=', midnight)
+ timestamps.orWhere(
+ 'alternative_quest_timestamp',
+ '>=',
+ midnight,
+ )
}
})
- quest.andWhere(questTypes => {
- questTypes.orWhereIn('quest_item_id', items)
+ quest.andWhere((questTypes) => {
+ questTypes
+ .orWhereIn('quest_item_id', items)
.orWhereIn('quest_pokemon_id', pokemon)
if (hasAltQuests) {
- questTypes.orWhereIn('alternative_quest_item_id', items)
+ questTypes
+ .orWhereIn('alternative_quest_item_id', items)
.orWhereIn('alternative_quest_pokemon_id', pokemon)
}
if (hasRewardAmount) {
- questTypes.orWhereIn(isMad ? 'quest_stardust' : 'quest_reward_amount', stardust)
+ questTypes.orWhereIn(
+ isMad ? 'quest_stardust' : 'quest_reward_amount',
+ stardust,
+ )
if (hasAltQuests) {
- questTypes.orWhereIn('alternative_quest_reward_amount', stardust)
+ questTypes.orWhereIn(
+ 'alternative_quest_reward_amount',
+ stardust,
+ )
}
} else {
- stardust.forEach(amount => {
- questTypes.orWhere(dust => {
- dust.where('quest_reward_type', 3)
- .andWhere(raw(`json_extract(quest_rewards, "$[0].info.amount") = ${amount}`))
+ stardust.forEach((amount) => {
+ questTypes.orWhere((dust) => {
+ dust
+ .where('quest_reward_type', 3)
+ .andWhere(
+ raw(
+ `json_extract(quest_rewards, "$[0].info.amount") = ${amount}`,
+ ),
+ )
})
if (hasAltQuests) {
- questTypes.orWhere(altDust => {
- altDust.where('alternative_quest_reward_type', 3)
- .andWhere(raw(`json_extract(alternative_quest_rewards, "$[0].info.amount") = ${amount}`))
+ questTypes.orWhere((altDust) => {
+ altDust
+ .where('alternative_quest_reward_type', 3)
+ .andWhere(
+ raw(
+ `json_extract(alternative_quest_rewards, "$[0].info.amount") = ${amount}`,
+ ),
+ )
})
}
})
}
- energy.forEach(megaEnergy => {
+ energy.forEach((megaEnergy) => {
const [pokeId, amount] = megaEnergy.split('-')
if (hasRewardAmount) {
- questTypes.orWhere(mega => {
- mega.where('quest_reward_type', 12)
- .andWhere(isMad ? 'quest_item_amount' : 'quest_reward_amount', amount)
+ questTypes.orWhere((mega) => {
+ mega
+ .where('quest_reward_type', 12)
+ .andWhere(
+ isMad ? 'quest_item_amount' : 'quest_reward_amount',
+ amount,
+ )
.andWhere('quest_pokemon_id', pokeId)
})
if (hasAltQuests) {
- questTypes.orWhere(altMega => {
- altMega.where('alternative_quest_reward_type', 12)
+ questTypes.orWhere((altMega) => {
+ altMega
+ .where('alternative_quest_reward_type', 12)
.andWhere('alternative_quest_reward_amount', amount)
.andWhere('alternative_quest_pokemon_id', pokeId)
})
}
} else {
- questTypes.orWhere(mega => {
+ questTypes.orWhere((mega) => {
mega.where('quest_reward_type', 12)
if (hasRewardAmount) {
- mega.andWhere('quest_reward_amount', amount)
+ mega
+ .andWhere('quest_reward_amount', amount)
.andWhere('quest_pokemon_id', pokeId)
} else {
- mega.andWhere(raw(`json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${isMad ? 'mega_resource' : 'info'}.pokemon_id") = ${pokeId}`))
- .andWhere(raw(`json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${isMad ? 'mega_resource' : 'info'}.amount") = ${amount}`))
+ mega
+ .andWhere(
+ raw(
+ `json_extract(${
+ isMad ? 'quest_reward' : 'quest_rewards'
+ }, "$[0].${
+ isMad ? 'mega_resource' : 'info'
+ }.pokemon_id") = ${pokeId}`,
+ ),
+ )
+ .andWhere(
+ raw(
+ `json_extract(${
+ isMad ? 'quest_reward' : 'quest_rewards'
+ }, "$[0].${
+ isMad ? 'mega_resource' : 'info'
+ }.amount") = ${amount}`,
+ ),
+ )
}
})
if (hasAltQuests) {
- questTypes.orWhere(altMega => {
+ questTypes.orWhere((altMega) => {
altMega.where('alternative_quest_reward_type', 12)
if (hasRewardAmount) {
- altMega.andWhere('alternative_quest_reward_amount', amount)
+ altMega
+ .andWhere('alternative_quest_reward_amount', amount)
.andWhere('alternative_quest_pokemon_id', pokeId)
} else {
- altMega.andWhere(raw(`json_extract(alternative_quest_rewards, "$[0].info.pokemon_id") = ${pokeId}`))
- .andWhere(raw(`json_extract(alternative_quest_rewards, "$[0].info.amount") = ${amount}`))
+ altMega
+ .andWhere(
+ raw(
+ `json_extract(alternative_quest_rewards, "$[0].info.pokemon_id") = ${pokeId}`,
+ ),
+ )
+ .andWhere(
+ raw(
+ `json_extract(alternative_quest_rewards, "$[0].info.amount") = ${amount}`,
+ ),
+ )
}
})
}
}
})
if (hasRewardAmount) {
- questTypes.orWhere('quest_reward_type', 4)
+ questTypes
+ .orWhere('quest_reward_type', 4)
.whereIn('quest_pokemon_id', candy)
if (hasAltQuests) {
- questTypes.orWhere('alternative_quest_reward_type', 4)
+ questTypes
+ .orWhere('alternative_quest_reward_type', 4)
.whereIn('alternative_quest_pokemon_id', candy)
}
} else {
- candy.forEach(poke => {
- questTypes.orWhere(candies => {
- candies.where('quest_reward_type', 4)
- .where(raw(`json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${isMad ? 'candy' : 'info'}.pokemon_id") = ${poke}`))
+ candy.forEach((poke) => {
+ questTypes.orWhere((candies) => {
+ candies
+ .where('quest_reward_type', 4)
+ .where(
+ raw(
+ `json_extract(${
+ isMad ? 'quest_reward' : 'quest_rewards'
+ }, "$[0].${
+ isMad ? 'candy' : 'info'
+ }.pokemon_id") = ${poke}`,
+ ),
+ )
})
if (hasAltQuests) {
- questTypes.orWhere(altCandies => {
- altCandies.where('alternative_quest_reward_type', 4)
- .where(raw(`json_extract(alternative_quest_rewards, "$[0].info.pokemon_id") = ${poke}`))
+ questTypes.orWhere((altCandies) => {
+ altCandies
+ .where('alternative_quest_reward_type', 4)
+ .where(
+ raw(
+ `json_extract(alternative_quest_rewards, "$[0].info.pokemon_id") = ${poke}`,
+ ),
+ )
})
}
})
}
if (hasRewardAmount) {
- questTypes.orWhere('quest_reward_type', 9)
+ questTypes
+ .orWhere('quest_reward_type', 9)
.whereIn('quest_pokemon_id', xlCandy)
if (hasAltQuests) {
- questTypes.orWhere('alternative_quest_reward_type', 9)
+ questTypes
+ .orWhere('alternative_quest_reward_type', 9)
.whereIn('alternative_quest_pokemon_id', xlCandy)
}
} else {
- xlCandy.forEach(poke => {
- questTypes.orWhere(xlCandies => {
- xlCandies.where('quest_reward_type', 9)
- .where(raw(`json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${isMad ? 'xl_candy' : 'info'}.pokemon_id") = ${poke}`))
+ xlCandy.forEach((poke) => {
+ questTypes.orWhere((xlCandies) => {
+ xlCandies
+ .where('quest_reward_type', 9)
+ .where(
+ raw(
+ `json_extract(${
+ isMad ? 'quest_reward' : 'quest_rewards'
+ }, "$[0].${
+ isMad ? 'xl_candy' : 'info'
+ }.pokemon_id") = ${poke}`,
+ ),
+ )
})
if (hasAltQuests) {
- questTypes.orWhere(altXlCandies => {
- altXlCandies.where('alternative_quest_reward_type', 9)
- .where(raw(`json_extract(alternative_quest_rewards, "$[0].info.pokemon_id") = ${poke}`))
+ questTypes.orWhere((altXlCandies) => {
+ altXlCandies
+ .where('alternative_quest_reward_type', 9)
+ .where(
+ raw(
+ `json_extract(alternative_quest_rewards, "$[0].info.pokemon_id") = ${poke}`,
+ ),
+ )
})
}
})
}
if (general.length && map.enableQuestRewardTypeFilters) {
- questTypes.orWhere(rewardType => {
+ questTypes.orWhere((rewardType) => {
rewardType.whereIn('quest_reward_type', general)
})
if (hasAltQuests) {
- questTypes.orWhere(altRewardType => {
- altRewardType.whereIn('alternative_quest_reward_type', general)
+ questTypes.orWhere((altRewardType) => {
+ altRewardType.whereIn(
+ 'alternative_quest_reward_type',
+ general,
+ )
})
}
}
@@ -279,111 +431,198 @@ module.exports = class Pokestop extends Model {
}
if (onlyInvasions && invasionPerms) {
if (hasMultiInvasions) {
- stops.orWhere(invasion => {
- invasion.whereIn('character', invasions)
- .andWhere(multiInvasionMs ? 'expiration_ms' : 'expiration', '>=', safeTs * (multiInvasionMs ? 1000 : 1))
+ stops.orWhere((invasion) => {
+ invasion
+ .whereIn('character', invasions)
+ .andWhere(
+ multiInvasionMs ? 'expiration_ms' : 'expiration',
+ '>=',
+ safeTs * (multiInvasionMs ? 1000 : 1),
+ )
})
} else {
- stops.orWhere(invasion => {
- invasion.whereIn(isMad ? 'incident_grunt_type' : 'grunt_type', invasions)
- .andWhere(isMad ? 'incident_expiration' : 'incident_expire_timestamp', '>=', isMad ? this.knex().fn.now() : safeTs)
+ stops.orWhere((invasion) => {
+ invasion
+ .whereIn(
+ isMad ? 'incident_grunt_type' : 'grunt_type',
+ invasions,
+ )
+ .andWhere(
+ isMad ? 'incident_expiration' : 'incident_expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : safeTs,
+ )
})
}
}
if (onlyArEligible && pokestopPerms) {
- stops.orWhere(ar => {
+ stops.orWhere((ar) => {
ar.where(isMad ? 'is_ar_scan_eligible' : 'ar_scan_eligible', 1)
})
}
})
}
const results = await query
- const normalized = isMad ? this.mapMAD(results, safeTs) : this.mapRDM(results, safeTs)
- if (normalized.length > queryLimits.pokestops) normalized.length = queryLimits.pokestops
- return this.secondaryFilter(normalized, args.filters, isMad, safeTs, midnight, perms)
+ const normalized = isMad
+ ? this.mapMAD(results, safeTs)
+ : this.mapRDM(results, safeTs)
+ if (normalized.length > queryLimits.pokestops)
+ normalized.length = queryLimits.pokestops
+ return this.secondaryFilter(
+ normalized,
+ args.filters,
+ isMad,
+ safeTs,
+ midnight,
+ perms,
+ )
}
static fieldAssigner(target, source, fields) {
- fields.forEach(field => (target[field] = source[field]))
+ fields.forEach((field) => (target[field] = source[field]))
}
// filters and removes unwanted data
- static secondaryFilter(queryResults, filters, isMad, safeTs, midnight, perms) {
+ static secondaryFilter(
+ queryResults,
+ filters,
+ isMad,
+ safeTs,
+ midnight,
+ perms,
+ ) {
const filteredResults = []
for (let i = 0; i < queryResults.length; i += 1) {
const pokestop = queryResults[i]
const filtered = {}
- this.fieldAssigner(filtered, pokestop, ['id', 'lat', 'lon', 'enabled', 'url', 'name', 'last_modified_timestamp', 'updated'])
+ this.fieldAssigner(filtered, pokestop, [
+ 'id',
+ 'lat',
+ 'lon',
+ 'enabled',
+ 'url',
+ 'name',
+ 'last_modified_timestamp',
+ 'updated',
+ ])
if (perms.pokestops) {
- this.fieldAssigner(filtered, pokestop, ['ar_scan_eligible', 'power_up_points', 'power_up_level', 'power_up_end_timestamp'])
+ this.fieldAssigner(filtered, pokestop, [
+ 'ar_scan_eligible',
+ 'power_up_points',
+ 'power_up_level',
+ 'power_up_end_timestamp',
+ ])
}
- if (perms.invasions && (filters.onlyAllPokestops || filters.onlyInvasions)) {
+ if (
+ perms.invasions &&
+ (filters.onlyAllPokestops || filters.onlyInvasions)
+ ) {
filtered.invasions = filters.onlyAllPokestops
? pokestop.invasions
- : pokestop.invasions.filter(invasion => filters[`i${invasion.grunt_type}`])
+ : pokestop.invasions.filter(
+ (invasion) => filters[`i${invasion.grunt_type}`],
+ )
}
- if (perms.lures
- && (filters.onlyAllPokestops
- || (filters.onlyLures && pokestop.lure_expire_timestamp >= safeTs && filters[`l${pokestop.lure_id}`]))) {
- this.fieldAssigner(filtered, pokestop, ['lure_id', 'lure_expire_timestamp'])
+ if (
+ perms.lures &&
+ (filters.onlyAllPokestops ||
+ (filters.onlyLures &&
+ pokestop.lure_expire_timestamp >= safeTs &&
+ filters[`l${pokestop.lure_id}`]))
+ ) {
+ this.fieldAssigner(filtered, pokestop, [
+ 'lure_id',
+ 'lure_expire_timestamp',
+ ])
}
if (perms.quests && (filters.onlyAllPokestops || filters.onlyQuests)) {
filtered.quests = []
- pokestop.quests.forEach(quest => {
- if (quest.quest_reward_type && (
- !map.enableQuestSetSelector
- || filters.onlyShowQuestSet === 'both'
- || (filters.onlyShowQuestSet === 'with_ar' && quest.with_ar)
- || (filters.onlyShowQuestSet === 'without_ar' && !quest.with_ar)
- )) {
+ pokestop.quests.forEach((quest) => {
+ if (
+ quest.quest_reward_type &&
+ (!map.enableQuestSetSelector ||
+ filters.onlyShowQuestSet === 'both' ||
+ (filters.onlyShowQuestSet === 'with_ar' && quest.with_ar) ||
+ (filters.onlyShowQuestSet === 'without_ar' && !quest.with_ar))
+ ) {
const newQuest = {}
if (isMad) {
this.parseMadRewards(quest)
} else {
this.parseRdmRewards(quest)
}
- const fields = ['quest_type', 'quest_timestamp', 'quest_target', 'quest_conditions', 'quest_task', 'quest_reward_type', 'quest_rewards', 'with_ar', 'quest_title']
+ const fields = [
+ 'quest_type',
+ 'quest_timestamp',
+ 'quest_target',
+ 'quest_conditions',
+ 'quest_task',
+ 'quest_reward_type',
+ 'quest_rewards',
+ 'with_ar',
+ 'quest_title',
+ ]
switch (quest.quest_reward_type) {
case 2:
newQuest.key = `q${quest.quest_item_id}`
- fields.push('quest_item_id', 'item_amount'); break
+ fields.push('quest_item_id', 'item_amount')
+ break
case 3:
newQuest.key = `d${quest.stardust_amount}`
- fields.push('stardust_amount'); break
+ fields.push('stardust_amount')
+ break
case 4:
newQuest.key = `c${quest.candy_pokemon_id}`
- fields.push('candy_pokemon_id', 'candy_amount'); break
+ fields.push('candy_pokemon_id', 'candy_amount')
+ break
case 7:
quest.quest_form_id = quest.quest_form_id ?? 0
newQuest.key = `${quest.quest_pokemon_id}-${quest.quest_form_id}`
- fields.push('quest_pokemon_id', 'quest_form_id', 'quest_costume_id', 'quest_gender_id', 'quest_shiny'); break
+ fields.push(
+ 'quest_pokemon_id',
+ 'quest_form_id',
+ 'quest_costume_id',
+ 'quest_gender_id',
+ 'quest_shiny',
+ )
+ break
case 9:
newQuest.key = `x${quest.xl_candy_pokemon_id}`
- fields.push('xl_candy_pokemon_id', 'xl_candy_amount'); break
+ fields.push('xl_candy_pokemon_id', 'xl_candy_amount')
+ break
case 12:
newQuest.key = `m${quest.mega_pokemon_id}-${quest.mega_amount}`
- fields.push('mega_pokemon_id', 'mega_amount'); break
+ fields.push('mega_pokemon_id', 'mega_amount')
+ break
default:
newQuest.key = `u${quest.quest_reward_type}`
}
- if (quest.quest_timestamp >= midnight && (filters.onlyAllPokestops
- || (filters[newQuest.key]
- && (filters[newQuest.key].adv ? quest.quest_title === filters[newQuest.key].adv : true))
- || (filters[`u${quest.quest_reward_type}`] && map.enableQuestRewardTypeFilters))) {
+ if (
+ quest.quest_timestamp >= midnight &&
+ (filters.onlyAllPokestops ||
+ (filters[newQuest.key] &&
+ (filters[newQuest.key].adv
+ ? quest.quest_title === filters[newQuest.key].adv
+ : true)) ||
+ (filters[`u${quest.quest_reward_type}`] &&
+ map.enableQuestRewardTypeFilters))
+ ) {
this.fieldAssigner(newQuest, quest, fields)
filtered.quests.push(newQuest)
}
}
})
}
- if ((pokestop.ar_scan_eligible && filters.onlyArEligible)
- || filters.onlyAllPokestops
- || filtered.quests?.length
- || filtered.invasions?.length
- || filtered.lure_id) {
+ if (
+ (pokestop.ar_scan_eligible && filters.onlyArEligible) ||
+ filters.onlyAllPokestops ||
+ filtered.quests?.length ||
+ filtered.invasions?.length ||
+ filtered.lure_id
+ ) {
filteredResults.push(filtered)
}
}
@@ -398,10 +637,12 @@ module.exports = class Pokestop extends Model {
const invasion = {}
if (filtered[result.id]) {
- Object.keys(madQuestProps).forEach(field => (quest[field] = result[field]))
+ Object.keys(madQuestProps).forEach(
+ (field) => (quest[field] = result[field]),
+ )
} else {
filtered[result.id] = { quests: [], invasions: [] }
- Object.keys(result).forEach(field => {
+ Object.keys(result).forEach((field) => {
if (madQuestProps[field]) {
quest[field] = result[field]
} else if (invasionProps[field]) {
@@ -431,12 +672,12 @@ module.exports = class Pokestop extends Model {
const invasion = {}
if (filtered[result.id]) {
- Object.keys(invasionProps).forEach(field => (
- invasion[field] = result[field]
- ))
+ Object.keys(invasionProps).forEach(
+ (field) => (invasion[field] = result[field]),
+ )
} else {
filtered[result.id] = { invasions: [], quests: [] }
- Object.keys(result).forEach(field => {
+ Object.keys(result).forEach((field) => {
if (questProps[field]) {
quest[field] = result[field]
} else if (questPropsAlt[field]) {
@@ -461,8 +702,14 @@ module.exports = class Pokestop extends Model {
return Object.values(filtered)
}
- static async getAvailable({ isMad, hasAltQuests, hasMultiInvasions, multiInvasionMs, hasRewardAmount }) {
- const ts = Math.floor((new Date()).getTime() / 1000)
+ static async getAvailable({
+ isMad,
+ hasAltQuests,
+ hasMultiInvasions,
+ multiInvasionMs,
+ hasRewardAmount,
+ }) {
+ const ts = Math.floor(new Date().getTime() / 1000)
const finalList = new Set()
const conditions = {}
const queries = {}
@@ -485,9 +732,17 @@ module.exports = class Pokestop extends Model {
.groupBy('quest_item_id', 'quest_title', 'quest_target')
if (hasAltQuests) {
queries.itemsAlt = this.query()
- .select('alternative_quest_item_id AS quest_item_id', 'alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
+ .select(
+ 'alternative_quest_item_id AS quest_item_id',
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
.where('alternative_quest_reward_type', 2)
- .groupBy('alternative_quest_item_id', 'alternative_quest_title', 'alternative_quest_target')
+ .groupBy(
+ 'alternative_quest_item_id',
+ 'alternative_quest_title',
+ 'alternative_quest_target',
+ )
}
if (isMad) {
queries.stardust = this.query()
@@ -496,32 +751,52 @@ module.exports = class Pokestop extends Model {
.where('quest_stardust', '>', 0)
.groupBy('amount', 'quest_title', 'quest_target')
} else {
- queries.stardust = this.query()
- .where('quest_reward_type', 3)
+ queries.stardust = this.query().where('quest_reward_type', 3)
if (hasRewardAmount) {
queries.stardust
- .select('quest_reward_amount AS amount', 'quest_title', 'quest_target')
+ .select(
+ 'quest_reward_amount AS amount',
+ 'quest_title',
+ 'quest_target',
+ )
.where('quest_reward_amount', '>', 0)
.groupBy('amount', 'quest_title', 'quest_target')
} else {
queries.stardust
.select('quest_title', 'quest_target')
- .distinct(raw('json_extract(quest_rewards, "$[0].info.amount")')
- .as('amount'))
+ .distinct(
+ raw('json_extract(quest_rewards, "$[0].info.amount")').as('amount'),
+ )
}
if (hasAltQuests) {
- queries.stardustAlt = this.query()
- .where('alternative_quest_reward_type', 3)
+ queries.stardustAlt = this.query().where(
+ 'alternative_quest_reward_type',
+ 3,
+ )
if (hasRewardAmount) {
queries.stardustAlt
- .select('alternative_quest_reward_amount AS amount', 'alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
+ .select(
+ 'alternative_quest_reward_amount AS amount',
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
.where('alternative_quest_reward_amount', '>', 0)
- .groupBy('amount', 'alternative_quest_title', 'alternative_quest_target')
+ .groupBy(
+ 'amount',
+ 'alternative_quest_title',
+ 'alternative_quest_target',
+ )
} else {
queries.stardustAlt
- .select('alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
- .distinct(raw('json_extract(alternative_quest_rewards, "$[0].info.amount")')
- .as('amount'))
+ .select(
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
+ .distinct(
+ raw(
+ 'json_extract(alternative_quest_rewards, "$[0].info.amount")',
+ ).as('amount'),
+ )
}
}
}
@@ -531,31 +806,54 @@ module.exports = class Pokestop extends Model {
if (hasRewardAmount) {
queries.mega
.select('quest_title', 'quest_target')
- .distinct(`${isMad ? 'quest_item_amount' : 'quest_reward_amount'} AS amount`)
+ .distinct(
+ `${isMad ? 'quest_item_amount' : 'quest_reward_amount'} AS amount`,
+ )
.distinct('quest_pokemon_id AS id')
} else {
queries.mega
.select('quest_title', 'quest_target')
- .distinct(raw(`json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${isMad ? 'mega_resource' : 'info'}.pokemon_id")`)
- .as('id'))
- .distinct(raw(`json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${isMad ? 'mega_resource' : 'info'}.amount")`)
- .as('amount'))
+ .distinct(
+ raw(
+ `json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${
+ isMad ? 'mega_resource' : 'info'
+ }.pokemon_id")`,
+ ).as('id'),
+ )
+ .distinct(
+ raw(
+ `json_extract(${isMad ? 'quest_reward' : 'quest_rewards'}, "$[0].${
+ isMad ? 'mega_resource' : 'info'
+ }.amount")`,
+ ).as('amount'),
+ )
}
if (hasAltQuests) {
- queries.megaAlt = this.query()
- .where('alternative_quest_reward_type', 12)
+ queries.megaAlt = this.query().where('alternative_quest_reward_type', 12)
if (hasRewardAmount) {
queries.megaAlt
- .select('alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
+ .select(
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
.distinct('alternative_quest_reward_amount AS amount')
.distinct('alternative_quest_pokemon_id AS id')
} else {
queries.megaAlt
- .select('alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
- .distinct(raw('json_extract(alternative_quest_rewards, "$[0].info.pokemon_id")')
- .as('id'))
- .distinct(raw('json_extract(alternative_quest_rewards, "$[0].info.amount")')
- .as('amount'))
+ .select(
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
+ .distinct(
+ raw(
+ 'json_extract(alternative_quest_rewards, "$[0].info.pokemon_id")',
+ ).as('id'),
+ )
+ .distinct(
+ raw(
+ 'json_extract(alternative_quest_rewards, "$[0].info.amount")',
+ ).as('amount'),
+ )
}
}
queries.candy = this.query()
@@ -565,7 +863,10 @@ module.exports = class Pokestop extends Model {
.where('quest_reward_type', 4)
if (hasAltQuests) {
queries.candyAlt = this.query()
- .select('alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
+ .select(
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
.distinct('alternative_quest_pokemon_id AS quest_pokemon_id')
.where('alternative_quest_reward_type', 4)
}
@@ -576,27 +877,48 @@ module.exports = class Pokestop extends Model {
.where('quest_reward_type', 9)
if (hasAltQuests) {
queries.xlCandyAlt = this.query()
- .select('alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
+ .select(
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
.distinct('alternative_quest_pokemon_id AS quest_pokemon_id')
.where('alternative_quest_reward_type', 9)
}
if (isMad) {
queries.pokemon = this.query()
- .select('quest_pokemon_id', 'quest_pokemon_form_id AS form', 'quest_title', 'quest_target')
+ .select(
+ 'quest_pokemon_id',
+ 'quest_pokemon_form_id AS form',
+ 'quest_title',
+ 'quest_target',
+ )
.from('trs_quest')
.where('quest_reward_type', 7)
- .groupBy('quest_pokemon_id', 'quest_pokemon_form_id', 'quest_title', 'quest_target')
+ .groupBy(
+ 'quest_pokemon_id',
+ 'quest_pokemon_form_id',
+ 'quest_title',
+ 'quest_target',
+ )
} else {
queries.pokemon = this.query()
.distinct('quest_pokemon_id')
- .select(raw('json_extract(quest_rewards, "$[0].info.form_id")')
- .as('form'), 'quest_title', 'quest_target')
+ .select(
+ raw('json_extract(quest_rewards, "$[0].info.form_id")').as('form'),
+ 'quest_title',
+ 'quest_target',
+ )
.where('quest_reward_type', 7)
if (hasAltQuests) {
queries.pokemonAlt = this.query()
.distinct('alternative_quest_pokemon_id AS quest_pokemon_id')
- .select(raw('json_extract(alternative_quest_rewards, "$[0].info.form_id")')
- .as('form'), 'alternative_quest_title AS quest_title', 'alternative_quest_target AS quest_target')
+ .select(
+ raw(
+ 'json_extract(alternative_quest_rewards, "$[0].info.form_id")',
+ ).as('form'),
+ 'alternative_quest_title AS quest_title',
+ 'alternative_quest_target AS quest_target',
+ )
.where('alternative_quest_reward_type', 7)
}
}
@@ -604,56 +926,128 @@ module.exports = class Pokestop extends Model {
queries.invasions = this.query()
.leftJoin('incident', 'pokestop.id', 'incident.pokestop_id')
.distinct('incident.character AS grunt_type')
- .where(multiInvasionMs ? 'expiration_ms' : 'incident.expiration', '>=', ts * (multiInvasionMs ? 1000 : 1))
+ .where(
+ multiInvasionMs ? 'expiration_ms' : 'incident.expiration',
+ '>=',
+ ts * (multiInvasionMs ? 1000 : 1),
+ )
.orderBy('grunt_type')
} else {
queries.invasions = this.query()
.distinct(isMad ? 'incident_grunt_type AS grunt_type' : 'grunt_type')
- .where(isMad ? 'incident_expiration' : 'incident_expire_timestamp', '>=', isMad ? this.knex().fn.now() : ts)
+ .where(
+ isMad ? 'incident_expiration' : 'incident_expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : ts,
+ )
.orderBy('grunt_type')
}
queries.lures = this.query()
.select(isMad ? 'active_fort_modifier AS lure_id' : 'lure_id')
- .andWhere(isMad ? 'lure_expiration' : 'lure_expire_timestamp', '>=', isMad ? this.knex().fn.now() : ts)
+ .andWhere(
+ isMad ? 'lure_expiration' : 'lure_expire_timestamp',
+ '>=',
+ isMad ? this.knex().fn.now() : ts,
+ )
.groupBy(isMad ? 'active_fort_modifier' : 'lure_id')
.orderBy(isMad ? 'active_fort_modifier' : 'lure_id')
const resolved = Object.fromEntries(
await Promise.all(
- Object.entries(queries).map(async ([key, query]) => ([key, await query])),
+ Object.entries(queries).map(async ([key, query]) => [key, await query]),
),
)
Object.entries(resolved).forEach(([questType, rewards]) => {
switch (questType) {
case 'itemsAlt':
- case 'items': rewards.forEach(reward => process(`q${reward.quest_item_id}`, reward.quest_title, reward.quest_target)); break
+ case 'items':
+ rewards.forEach((reward) =>
+ process(
+ `q${reward.quest_item_id}`,
+ reward.quest_title,
+ reward.quest_target,
+ ),
+ )
+ break
case 'megaAlt':
- case 'mega': rewards.forEach(reward => process(`m${reward.id}-${reward.amount}`, reward.quest_title, reward.quest_target)); break
+ case 'mega':
+ rewards.forEach((reward) =>
+ process(
+ `m${reward.id}-${reward.amount}`,
+ reward.quest_title,
+ reward.quest_target,
+ ),
+ )
+ break
case 'stardustAlt':
- case 'stardust': rewards.forEach(reward => process(`d${reward.amount}`, reward.quest_title, reward.quest_target)); break
+ case 'stardust':
+ rewards.forEach((reward) =>
+ process(
+ `d${reward.amount}`,
+ reward.quest_title,
+ reward.quest_target,
+ ),
+ )
+ break
case 'candyAlt':
- case 'candy': rewards.forEach(reward => process(`c${reward.id}`, reward.quest_title, reward.quest_target)); break
+ case 'candy':
+ rewards.forEach((reward) =>
+ process(`c${reward.id}`, reward.quest_title, reward.quest_target),
+ )
+ break
case 'xlCandyAlt':
- case 'xlCandy': rewards.forEach(reward => process(`x${reward.id}`, reward.quest_title, reward.quest_target)); break
- case 'lures': rewards.forEach(reward => finalList.add(`l${reward.lure_id}`)); break
- case 'invasions': rewards.forEach(reward => finalList.add(`i${reward.grunt_type}`)); break
- default: rewards.forEach(reward => process(`${reward.quest_pokemon_id}-${reward.form ?? 0}`, reward.quest_title, reward.quest_target)); break
+ case 'xlCandy':
+ rewards.forEach((reward) =>
+ process(`x${reward.id}`, reward.quest_title, reward.quest_target),
+ )
+ break
+ case 'lures':
+ rewards.forEach((reward) => finalList.add(`l${reward.lure_id}`))
+ break
+ case 'invasions':
+ rewards.forEach((reward) => finalList.add(`i${reward.grunt_type}`))
+ break
+ default:
+ rewards.forEach((reward) =>
+ process(
+ `${reward.quest_pokemon_id}-${reward.form ?? 0}`,
+ reward.quest_title,
+ reward.quest_target,
+ ),
+ )
+ break
}
})
- return { available: finalList.size ? [...finalList] : await fetchQuests(), conditions }
+ return {
+ available: finalList.size ? [...finalList] : await fetchQuests(),
+ conditions,
+ }
}
static parseRdmRewards = (quest) => {
if (quest.quest_reward_type) {
const { info } = JSON.parse(quest.quest_rewards)[0]
switch (quest.quest_reward_type) {
- case 2: Object.keys(info).forEach(x => (quest[`item_${x}`] = info[x])); break
- case 3: Object.keys(info).forEach(x => (quest[`stardust_${x}`] = info[x])); break
- case 4: Object.keys(info).forEach(x => (quest[`candy_${x}`] = info[x])); break
- case 7: Object.keys(info).forEach(x => (quest[`quest_${x}`] = info[x])); break
- case 9: Object.keys(info).forEach(x => (quest[`xl_candy_${x}`] = info[x])); break
- case 12: Object.keys(info).forEach(x => (quest[`mega_${x}`] = info[x])); break
- default: break
+ case 2:
+ Object.keys(info).forEach((x) => (quest[`item_${x}`] = info[x]))
+ break
+ case 3:
+ Object.keys(info).forEach((x) => (quest[`stardust_${x}`] = info[x]))
+ break
+ case 4:
+ Object.keys(info).forEach((x) => (quest[`candy_${x}`] = info[x]))
+ break
+ case 7:
+ Object.keys(info).forEach((x) => (quest[`quest_${x}`] = info[x]))
+ break
+ case 9:
+ Object.keys(info).forEach((x) => (quest[`xl_candy_${x}`] = info[x]))
+ break
+ case 12:
+ Object.keys(info).forEach((x) => (quest[`mega_${x}`] = info[x]))
+ break
+ default:
+ break
}
}
return quest
@@ -661,15 +1055,28 @@ module.exports = class Pokestop extends Model {
static parseMadRewards = (quest) => {
if (quest.quest_reward_type) {
- const {
- item, candy, xl_candy, mega_resource,
- } = JSON.parse(quest.quest_rewards)[0]
+ const { item, candy, xl_candy, mega_resource } = JSON.parse(
+ quest.quest_rewards,
+ )[0]
switch (quest.quest_reward_type) {
- case 2: Object.keys(item).forEach(x => (quest[`item_${x}`] = item[x])); break
- case 4: Object.keys(candy).forEach(x => (quest[`candy_${x}`] = candy[x])); break
- case 9: Object.keys(xl_candy).forEach(x => (quest[`xl_candy_${x}`] = candy[x])); break
- case 12: Object.keys(mega_resource).forEach(x => (quest[`mega_${x}`] = mega_resource[x])); break
- default: break
+ case 2:
+ Object.keys(item).forEach((x) => (quest[`item_${x}`] = item[x]))
+ break
+ case 4:
+ Object.keys(candy).forEach((x) => (quest[`candy_${x}`] = candy[x]))
+ break
+ case 9:
+ Object.keys(xl_candy).forEach(
+ (x) => (quest[`xl_candy_${x}`] = candy[x]),
+ )
+ break
+ case 12:
+ Object.keys(mega_resource).forEach(
+ (x) => (quest[`mega_${x}`] = mega_resource[x]),
+ )
+ break
+ default:
+ break
}
}
return quest
@@ -699,27 +1106,31 @@ module.exports = class Pokestop extends Model {
const { search, locale, midnight: clientMidnight } = args
const midnight = settings.hideOldQuests ? clientMidnight : 0
- const pokemonIds = Object.keys(Event.masterfile.pokemon).filter(pkmn => (
- i18next.t(`poke_${pkmn}`, { lng: locale })
+ const pokemonIds = Object.keys(Event.masterfile.pokemon).filter((pkmn) =>
+ i18next
+ .t(`poke_${pkmn}`, { lng: locale })
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
- .includes(search)
- ))
- const itemIds = Object.keys(Event.masterfile.items).filter(item => (
- i18next.t(`item_${item}`, { lng: locale })
- .normalize('NFD')
- .replace(/[\u0300-\u036f]/g, '')
- .toLowerCase()
- .includes(search)
- ))
- const rewardTypes = Object.keys(Event.masterfile.questRewardTypes).filter(rType => (
- i18next.t(`quest_reward_${rType}`, { lng: locale })
+ .includes(search),
+ )
+ const itemIds = Object.keys(Event.masterfile.items).filter((item) =>
+ i18next
+ .t(`item_${item}`, { lng: locale })
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
- .includes(search)
- ))
+ .includes(search),
+ )
+ const rewardTypes = Object.keys(Event.masterfile.questRewardTypes).filter(
+ (rType) =>
+ i18next
+ .t(`quest_reward_${rType}`, { lng: locale })
+ .normalize('NFD')
+ .replace(/[\u0300-\u036f]/g, '')
+ .toLowerCase()
+ .includes(search),
+ )
const query = this.query()
.select([
@@ -732,15 +1143,17 @@ module.exports = class Pokestop extends Model {
])
.where(isMad ? 'enabled' : 'deleted', isMad)
.andWhere('quest_timestamp', '>=', midnight || 0)
- .andWhere(quests => {
- quests.whereIn('quest_pokemon_id', pokemonIds)
+ .andWhere((quests) => {
+ quests
+ .whereIn('quest_pokemon_id', pokemonIds)
.orWhereIn('quest_item_id', itemIds)
.orWhereIn('quest_reward_type', rewardTypes)
})
.limit(searchResultsLimit)
.orderBy('distance')
if (isMad) {
- query.leftJoin('trs_quest', 'pokestop.pokestop_id', 'trs_quest.GUID')
+ query
+ .leftJoin('trs_quest', 'pokestop.pokestop_id', 'trs_quest.GUID')
.select([
'quest_stardust AS stardust_amount',
'quest_pokemon_form_id AS quest_form_id',
@@ -751,15 +1164,16 @@ module.exports = class Pokestop extends Model {
getAreaSql(query, perms.areaRestrictions, isMad)
}
const results = await query
- const mapped = results.map(q => ({ ...q, with_ar: q.with_ar ?? true }))
+ const mapped = results.map((q) => ({ ...q, with_ar: q.with_ar ?? true }))
if (hasAltQuests) {
const altQuestQuery = this.query()
.select(['*', distance])
.where('deleted', false)
.andWhere('alternative_quest_timestamp', '>=', midnight || 0)
- .andWhere(quests => {
- quests.whereIn('alternative_quest_pokemon_id', pokemonIds)
+ .andWhere((quests) => {
+ quests
+ .whereIn('alternative_quest_pokemon_id', pokemonIds)
.orWhereIn('alternative_quest_item_id', itemIds)
.orWhereIn('alternative_quest_reward_type', rewardTypes)
})
@@ -769,7 +1183,7 @@ module.exports = class Pokestop extends Model {
getAreaSql(altQuestQuery, perms.areaRestrictions, isMad)
}
const altQuestResults = await altQuestQuery
- const remapped = altQuestResults.map(result => ({
+ const remapped = altQuestResults.map((result) => ({
...result,
quest_rewards: result.alternative_quest_rewards,
quest_reward_type: result.alternative_quest_reward_type,
@@ -783,7 +1197,11 @@ module.exports = class Pokestop extends Model {
mapped.sort((a, b) => a.distance - b.distance)
mapped.length = searchResultsLimit
}
- return mapped.map(result => isMad ? this.parseMadRewards(result) : this.parseRdmRewards(result)).filter(x => x)
+ return mapped
+ .map((result) =>
+ isMad ? this.parseMadRewards(result) : this.parseRdmRewards(result),
+ )
+ .filter((x) => x)
}
static getOne(id, { isMad }) {
@@ -798,21 +1216,21 @@ module.exports = class Pokestop extends Model {
static getSubmissions(args, { isMad }) {
const query = this.query()
- .whereBetween(`lat${isMad ? 'itude' : ''}`, [args.minLat - 0.025, args.maxLat + 0.025])
- .andWhereBetween(`lon${isMad ? 'gitude' : ''}`, [args.minLon - 0.025, args.maxLon + 0.025])
+ .whereBetween(`lat${isMad ? 'itude' : ''}`, [
+ args.minLat - 0.025,
+ args.maxLat + 0.025,
+ ])
+ .andWhereBetween(`lon${isMad ? 'gitude' : ''}`, [
+ args.minLon - 0.025,
+ args.maxLon + 0.025,
+ ])
.andWhere(isMad ? 'enabled' : 'deleted', isMad)
if (isMad) {
- query.select([
- 'pokestop_id AS id',
- 'latitude AS lat',
- 'longitude AS lon',
- ])
+ query.select(['pokestop_id AS id', 'latitude AS lat', 'longitude AS lon'])
} else {
- query.select(['id', 'lat', 'lon'])
- .andWhere(poi => {
- poi.whereNull('sponsor_id')
- .orWhere('sponsor_id', 0)
- })
+ query.select(['id', 'lat', 'lon']).andWhere((poi) => {
+ poi.whereNull('sponsor_id').orWhere('sponsor_id', 0)
+ })
}
return query
}
diff --git a/server/src/models/Portal.js b/server/src/models/Portal.js
index 27f051954..cd8409de3 100644
--- a/server/src/models/Portal.js
+++ b/server/src/models/Portal.js
@@ -14,7 +14,11 @@ module.exports = class Portal extends Model {
const query = this.query()
.whereBetween('lat', [args.minLat, args.maxLat])
.andWhereBetween('lon', [args.minLon, args.maxLon])
- .andWhere('updated', '>', (Date.now() / 1000) - portalUpdateLimit * 60 * 60 * 24)
+ .andWhere(
+ 'updated',
+ '>',
+ Date.now() / 1000 - portalUpdateLimit * 60 * 60 * 24,
+ )
if (areaRestrictions?.length) {
getAreaSql(query, areaRestrictions)
}
@@ -24,16 +28,13 @@ module.exports = class Portal extends Model {
static async search(perms, args, { isMad }, distance) {
const { areaRestrictions } = perms
const query = this.query()
- .select([
- 'name',
- 'id',
- 'lat',
- 'lon',
- 'url',
- distance,
- ])
+ .select(['name', 'id', 'lat', 'lon', 'url', distance])
.whereRaw(`LOWER(name) LIKE '%${args.search}%'`)
- .andWhere('updated', '>', (Date.now() / 1000) - portalUpdateLimit * 60 * 60 * 24)
+ .andWhere(
+ 'updated',
+ '>',
+ Date.now() / 1000 - portalUpdateLimit * 60 * 60 * 24,
+ )
.limit(searchResultsLimit)
.orderBy('distance')
if (areaRestrictions?.length) {
diff --git a/server/src/models/ScanCell.js b/server/src/models/ScanCell.js
index 20e9d8861..8627e9629 100644
--- a/server/src/models/ScanCell.js
+++ b/server/src/models/ScanCell.js
@@ -1,7 +1,9 @@
const { Model, ref } = require('objection')
const getPolyVector = require('../services/functions/getPolyVector')
const getAreaSql = require('../services/functions/getAreaSql')
-const { api: { queryLimits } } = require('../services/config')
+const {
+ api: { queryLimits },
+} = require('../services/config')
module.exports = class ScanCell extends Model {
static get tableName() {
@@ -11,18 +13,22 @@ module.exports = class ScanCell extends Model {
static async getAll(perms, args, { isMad }) {
const { areaRestrictions } = perms
const query = this.query()
- .select(['*', ref('id')
- .castTo('CHAR')
- .as('id')])
- .whereBetween(`center_lat${isMad ? 'itude' : ''}`, [args.minLat - 0.01, args.maxLat + 0.01])
- .andWhereBetween(`center_lon${isMad ? 'gitude' : ''}`, [args.minLon - 0.01, args.maxLon + 0.01])
+ .select(['*', ref('id').castTo('CHAR').as('id')])
+ .whereBetween(`center_lat${isMad ? 'itude' : ''}`, [
+ args.minLat - 0.01,
+ args.maxLat + 0.01,
+ ])
+ .andWhereBetween(`center_lon${isMad ? 'gitude' : ''}`, [
+ args.minLon - 0.01,
+ args.maxLon + 0.01,
+ ])
if (areaRestrictions?.length) {
getAreaSql(query, areaRestrictions, isMad, 's2cell')
}
const results = await query
.limit(queryLimits.scanCells)
.from(isMad ? 'trs_s2cells' : 's2cell')
- return results.map(cell => ({
+ return results.map((cell) => ({
...cell,
polygon: getPolyVector(cell.id, 'polygon'),
}))
diff --git a/server/src/models/Session.js b/server/src/models/Session.js
index 0af86b7a9..838a880a0 100644
--- a/server/src/models/Session.js
+++ b/server/src/models/Session.js
@@ -1,5 +1,9 @@
const { Model } = require('objection')
-const { database: { settings: { sessionTableName } } } = require('../services/config')
+const {
+ database: {
+ settings: { sessionTableName },
+ },
+} = require('../services/config')
module.exports = class Session extends Model {
static get tableName() {
diff --git a/server/src/models/Spawnpoint.js b/server/src/models/Spawnpoint.js
index b9b441c22..2584900c3 100644
--- a/server/src/models/Spawnpoint.js
+++ b/server/src/models/Spawnpoint.js
@@ -1,6 +1,8 @@
const { Model, raw } = require('objection')
const getAreaSql = require('../services/functions/getAreaSql')
-const { api: { queryLimits } } = require('../services/config')
+const {
+ api: { queryLimits },
+} = require('../services/config')
module.exports = class Spawnpoint extends Model {
static get tableName() {
@@ -15,14 +17,16 @@ module.exports = class Spawnpoint extends Model {
'spawnpoint AS id',
'latitude AS lat',
'longitude AS lon',
- raw('ROUND(calc_endminsec)')
- .as('despawn_sec'),
- raw('UNIX_TIMESTAMP(last_scanned)')
- .as('updated'),
+ raw('ROUND(calc_endminsec)').as('despawn_sec'),
+ raw('UNIX_TIMESTAMP(last_scanned)').as('updated'),
])
}
- query.whereBetween(`lat${isMad ? 'itude' : ''}`, [args.minLat, args.maxLat])
- .andWhereBetween(`lon${isMad ? 'gitude' : ''}`, [args.minLon, args.maxLon])
+ query
+ .whereBetween(`lat${isMad ? 'itude' : ''}`, [args.minLat, args.maxLat])
+ .andWhereBetween(`lon${isMad ? 'gitude' : ''}`, [
+ args.minLon,
+ args.maxLon,
+ ])
if (areaRestrictions?.length) {
getAreaSql(query, areaRestrictions, isMad)
}
diff --git a/server/src/models/User.js b/server/src/models/User.js
index c14889c7d..3f4b4b63a 100644
--- a/server/src/models/User.js
+++ b/server/src/models/User.js
@@ -1,7 +1,9 @@
/* eslint-disable no-console */
const { Model } = require('objection')
const {
- database: { settings: { userTableName, gymBadgeTableName } },
+ database: {
+ settings: { userTableName, gymBadgeTableName },
+ },
} = require('../services/config')
module.exports = class User extends Model {
@@ -13,7 +15,11 @@ module.exports = class User extends Model {
await this.query()
.update({ [`${strategy}Perms`]: null })
.where({ [`${strategy}Id`]: userId })
- .then(() => console.log(`[${botName}] Cleared ${strategy} perms for user ${userId}`))
+ .then(() =>
+ console.log(
+ `[${botName}] Cleared ${strategy} perms for user ${userId}`,
+ ),
+ )
}
static get relationMappings() {
diff --git a/server/src/models/Weather.js b/server/src/models/Weather.js
index abb7dc7fb..25818a3b9 100644
--- a/server/src/models/Weather.js
+++ b/server/src/models/Weather.js
@@ -1,6 +1,8 @@
const { Model, ref, raw } = require('objection')
const getPolyVector = require('../services/functions/getPolyVector')
-const { api: { weatherCellLimit } } = require('../services/config')
+const {
+ api: { weatherCellLimit },
+} = require('../services/config')
module.exports = class Weather extends Model {
static get tableName() {
@@ -8,26 +10,24 @@ module.exports = class Weather extends Model {
}
static async getAll(_perms, _args, { isMad }) {
- const query = this.query()
- .select([
- '*',
- ref(isMad ? 's2_cell_id' : 'id')
- .castTo('CHAR')
- .as('id'),
- ])
+ const query = this.query().select([
+ '*',
+ ref(isMad ? 's2_cell_id' : 'id')
+ .castTo('CHAR')
+ .as('id'),
+ ])
if (isMad) {
query.select([
'gameplay_weather AS gameplay_condition',
- raw('UNIX_TIMESTAMP(last_updated)')
- .as('updated'),
+ raw('UNIX_TIMESTAMP(last_updated)').as('updated'),
])
} else {
- const ts = Math.floor((new Date()).getTime() / 1000)
- const ms = ts - (weatherCellLimit * 60 * 60 * 24)
+ const ts = Math.floor(new Date().getTime() / 1000)
+ const ms = ts - weatherCellLimit * 60 * 60 * 24
query.where('updated', '>=', ms)
}
const results = await query
- return results.map(cell => ({
+ return results.map((cell) => ({
...cell,
polygon: getPolyVector(cell.id, true),
}))
diff --git a/server/src/routes/api/apiIndex.js b/server/src/routes/api/apiIndex.js
index a7e479024..d5a2e8108 100644
--- a/server/src/routes/api/apiIndex.js
+++ b/server/src/routes/api/apiIndex.js
@@ -8,7 +8,7 @@ const fs = require('fs')
// Loads in the API V1 Routes, including custom ones
fs.readdir(`${__dirname}/v1/`, (e, files) => {
if (e) return console.error(e, 'Error initializing an API endpoint')
- files.forEach(file => {
+ files.forEach((file) => {
try {
router.use(`/v1/${file.replace('.js', '')}`, require(`./v1/${file}`))
console.log(`[API] Loaded ${file}`)
diff --git a/server/src/routes/api/v1/available.js b/server/src/routes/api/v1/available.js
index 4fa62adfc..b74188a5f 100644
--- a/server/src/routes/api/v1/available.js
+++ b/server/src/routes/api/v1/available.js
@@ -16,65 +16,87 @@ const resolveCategory = (category) => {
case 'gym':
case 'gyms':
case 'raid':
- case 'raids': return 'raids'
+ case 'raids':
+ return 'raids'
case 'pokestop':
case 'pokestops':
case 'quest':
- case 'quests': return 'quests'
+ case 'quests':
+ return 'quests'
case 'pokemon':
- case 'pokemons': return 'pokemon'
- default: return 'all'
+ case 'pokemons':
+ return 'pokemon'
+ default:
+ return 'all'
}
}
const getAll = async (compare) => {
const available = compare
? await Promise.all([
- Db.getAvailable('Pokemon'),
- Db.getAvailable('Pokestop'),
- Db.getAvailable('Gym'),
- Db.getAvailable('Nest'),
- ])
+ Db.getAvailable('Pokemon'),
+ Db.getAvailable('Pokestop'),
+ Db.getAvailable('Gym'),
+ Db.getAvailable('Nest'),
+ ])
: [
- Event.available.pokemon,
- Event.available.pokestops,
- Event.available.gyms,
- Event.available.nests,
- ]
- return Object.fromEntries(Object.keys(queryObj).map((key, i) => [key, available[i]]))
+ Event.available.pokemon,
+ Event.available.pokestops,
+ Event.available.gyms,
+ Event.available.nests,
+ ]
+ return Object.fromEntries(
+ Object.keys(queryObj).map((key, i) => [key, available[i]]),
+ )
}
router.get(['/', '/:category'], async (req, res) => {
- const { model, category } = queryObj[resolveCategory(req.params.category)] || {}
+ const { model, category } =
+ queryObj[resolveCategory(req.params.category)] || {}
const { current, equal } = req.query
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
if (model && category) {
- const available = current !== undefined
- ? await Db.getAvailable(model)
- : Event.available[category]
+ const available =
+ current !== undefined
+ ? await Db.getAvailable(model)
+ : Event.available[category]
available.sort((a, b) => a.localeCompare(b))
if (equal !== undefined) {
- const compare = current !== undefined
- ? Event.available[category]
- : await Db.getAvailable(model)
+ const compare =
+ current !== undefined
+ ? Event.available[category]
+ : await Db.getAvailable(model)
compare.sort((a, b) => a.localeCompare(b))
- res.status(200).json(available.every((item, i) => item === compare[i]))
+ res
+ .status(200)
+ .json(available.every((item, i) => item === compare[i]))
} else {
res.status(200).json(available)
}
} else {
const available = await getAll(current)
- Object.values(available).forEach(c => c.sort((a, b) => a.localeCompare(b)))
+ Object.values(available).forEach((c) =>
+ c.sort((a, b) => a.localeCompare(b)),
+ )
if (equal !== undefined) {
const compare = await getAll(!current)
- Object.values(compare).forEach(c => c.sort((a, b) => a.localeCompare(b)))
+ Object.values(compare).forEach((c) =>
+ c.sort((a, b) => a.localeCompare(b)),
+ )
- res.status(200).json(Object.keys(available).every(cat => (
- available[cat].every((item, j) => item === compare[cat][j])
- )))
+ res
+ .status(200)
+ .json(
+ Object.keys(available).every((cat) =>
+ available[cat].every((item, j) => item === compare[cat][j]),
+ ),
+ )
} else {
res.status(200).json(available)
}
@@ -90,9 +112,13 @@ router.get(['/', '/:category'], async (req, res) => {
})
router.put('/:category', async (req, res) => {
- const { model, category } = queryObj[resolveCategory(req.params.category)] || {}
+ const { model, category } =
+ queryObj[resolveCategory(req.params.category)] || {}
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
if (model && category) {
await Event.setAvailable(category, model, Db)
} else {
@@ -103,11 +129,17 @@ router.put('/:category', async (req, res) => {
Event.setAvailable('nests', 'Nest', Db),
])
}
- res.status(200).json({ status: `updated availabled for ${category || 'all'}` })
+ res
+ .status(200)
+ .json({ status: `updated availabled for ${category || 'all'}` })
} else {
throw new Error('Incorrect or missing API secret')
}
- console.log(`[API] api/v1/${path.parse(__filename).name} - updated availabled for ${category || 'all'}`)
+ console.log(
+ `[API] api/v1/${path.parse(__filename).name} - updated availabled for ${
+ category || 'all'
+ }`,
+ )
} catch (e) {
console.error(`[API] api/v1/${path.parse(__filename).name}`, e)
res.status(500).json({ status: 'ServerError', reason: e.message })
diff --git a/server/src/routes/api/v1/sessions.js b/server/src/routes/api/v1/sessions.js
index 2d3b71ea0..0194ee948 100644
--- a/server/src/routes/api/v1/sessions.js
+++ b/server/src/routes/api/v1/sessions.js
@@ -5,10 +5,12 @@ const { Session } = require('../../../models/index')
router.get('/', async (req, res) => {
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
- const ts = Math.floor((new Date()).getTime() / 1000)
- res.status(200).json(await Session.query()
- .where('expires', '>=', ts))
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
+ const ts = Math.floor(new Date().getTime() / 1000)
+ res.status(200).json(await Session.query().where('expires', '>=', ts))
} else {
throw new Error('Incorrect or missing API secret')
}
@@ -20,9 +22,13 @@ router.get('/', async (req, res) => {
})
router.get('/hasValid/:id', async (req, res) => {
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
- const results = await Session.query()
- .whereRaw(`json_extract(data, '$.passport.user.id') = ${req.params.id}`)
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
+ const results = await Session.query().whereRaw(
+ `json_extract(data, '$.passport.user.id') = ${req.params.id}`,
+ )
res.status(200).json({
valid: Boolean(results.length),
length: results.length,
@@ -38,7 +44,10 @@ router.get('/hasValid/:id', async (req, res) => {
router.get('/clearSessions/:id', async (req, res) => {
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
const results = await Session.query()
.whereRaw(`json_extract(data, '$.passport.user.id') = ${req.params.id}`)
.delete()
@@ -48,7 +57,10 @@ router.get('/clearSessions/:id', async (req, res) => {
}
console.log(`[API] api/v1/sessions/clearSessions/${req.params.id}`)
} catch (e) {
- console.error(`[API Error] api/v1/sessions/clearSessions/${req.params.id}`, e)
+ console.error(
+ `[API Error] api/v1/sessions/clearSessions/${req.params.id}`,
+ e,
+ )
res.status(500).json({ status: 'ServerError', reason: e.message })
}
})
diff --git a/server/src/routes/api/v1/users.js b/server/src/routes/api/v1/users.js
index 3ec98b4f6..a97db2ea3 100644
--- a/server/src/routes/api/v1/users.js
+++ b/server/src/routes/api/v1/users.js
@@ -5,7 +5,10 @@ const { User } = require('../../../models/index')
router.get('/', async (req, res) => {
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
res.status(200).json(await User.query())
} else {
throw new Error('Incorrect or missing API secret')
@@ -19,7 +22,10 @@ router.get('/', async (req, res) => {
router.get('/:id', async (req, res) => {
try {
- if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) {
+ if (
+ api.reactMapSecret &&
+ req.headers['react-map-secret'] === api.reactMapSecret
+ ) {
res.status(200).json(await User.query().findById(req.params.id))
} else {
throw new Error('Incorrect or missing API secret')
diff --git a/server/src/routes/authRouter.js b/server/src/routes/authRouter.js
index 2bb16e2fd..f9f78a474 100644
--- a/server/src/routes/authRouter.js
+++ b/server/src/routes/authRouter.js
@@ -3,22 +3,32 @@
/* eslint-disable no-console */
const router = require('express').Router()
const passport = require('passport')
-const { isValidSession, clearOtherSessions } = require('../services/sessionStore')
-const { authentication: { strategies } } = require('../services/config')
+const {
+ isValidSession,
+ clearOtherSessions,
+} = require('../services/sessionStore')
+const {
+ authentication: { strategies },
+} = require('../services/config')
// Loads up the base auth routes and any custom ones
-strategies.forEach(strategy => {
- const method = strategy.type === 'discord' || strategy.type === 'telegram' ? 'get' : 'post'
+strategies.forEach((strategy) => {
+ const method =
+ strategy.type === 'discord' || strategy.type === 'telegram' ? 'get' : 'post'
if (strategy.enabled) {
- router[method](`/${strategy.name}`, passport.authenticate(strategy.name, {
- failureRedirect: '/',
- successRedirect: '/',
- }))
router[method](
- `/${strategy.name}/callback`,
- async (req, res, next) => passport.authenticate(strategy.name, async (err, user, info) => {
- if (err) { return next(err) }
+ `/${strategy.name}`,
+ passport.authenticate(strategy.name, {
+ failureRedirect: '/',
+ successRedirect: '/',
+ }),
+ )
+ router[method](`/${strategy.name}/callback`, async (req, res, next) =>
+ passport.authenticate(strategy.name, async (err, user, info) => {
+ if (err) {
+ return next(err)
+ }
if (!user) {
res.status(401).json(info.message)
} else {
@@ -26,7 +36,9 @@ strategies.forEach(strategy => {
return req.login(user, async () => {
const { id } = user
if (!(await isValidSession(id))) {
- console.debug('[Session] Detected multiple sessions, clearing old ones...')
+ console.debug(
+ '[Session] Detected multiple sessions, clearing old ones...',
+ )
await clearOtherSessions(id, req.sessionID)
}
return res.redirect('/')
@@ -38,7 +50,11 @@ strategies.forEach(strategy => {
}
})(req, res, next),
)
- console.log(`[AUTH] ${method.toUpperCase()} /auth/${strategy.name}/callback route initialized`)
+ console.log(
+ `[AUTH] ${method.toUpperCase()} /auth/${
+ strategy.name
+ }/callback route initialized`,
+ )
}
})
diff --git a/server/src/routes/rootRouter.js b/server/src/routes/rootRouter.js
index d13d39c36..4a198dec3 100644
--- a/server/src/routes/rootRouter.js
+++ b/server/src/routes/rootRouter.js
@@ -27,8 +27,16 @@ rootRouter.get('/logout', (req, res) => {
rootRouter.post('/clientError', (req) => {
if (req.headers.version === version && req.isAuthenticated()) {
- const { body: { error }, user } = req
- const userName = user?.username || user?.discordId || user?.telegramId || user?.id || 'Unknown'
+ const {
+ body: { error },
+ user,
+ } = req
+ const userName =
+ user?.username ||
+ user?.discordId ||
+ user?.telegramId ||
+ user?.id ||
+ 'Unknown'
if (error && config.devOptions.clientErrors) {
console.error('[CLIENT]', error, `- User: ${userName}`)
}
@@ -43,13 +51,17 @@ rootRouter.get('/area/:area/:zoom?', (req, res) => {
? scanAreas[req.headers.host]
: scanAreas.main
if (validScanAreas.features.length) {
- const foundArea = validScanAreas.features.find(a => a.properties.name.toLowerCase() === area.toLowerCase())
+ const foundArea = validScanAreas.features.find(
+ (a) => a.properties.name.toLowerCase() === area.toLowerCase(),
+ )
if (foundArea) {
const [lon, lat] = center(foundArea).geometry.coordinates
return res.redirect(`/@/${lat}/${lon}/${zoom || 18}`)
}
if (manualAreas.length) {
- const { lat, lon } = manualAreas.find(a => a.name.toLowerCase() === area.toLowerCase())
+ const { lat, lon } = manualAreas.find(
+ (a) => a.name.toLowerCase() === area.toLowerCase(),
+ )
return res.redirect(`/@/${lat}/${lon}/${zoom || 18}`)
}
return res.redirect('/404')
@@ -62,20 +74,32 @@ rootRouter.get('/area/:area/:zoom?', (req, res) => {
rootRouter.get('/settings', async (req, res) => {
try {
- if (config.authentication.alwaysEnabledPerms.length || !config.authMethods.length) {
+ if (
+ config.authentication.alwaysEnabledPerms.length ||
+ !config.authMethods.length
+ ) {
if (req.session.tutorial === undefined) {
req.session.tutorial = !config.map.forceTutorial
}
req.session.perms = {
areaRestrictions: Utility.areaPerms(['none']),
webhooks: [],
- scanner: Object.keys(config.scanner).filter((key) => key !== 'backendConfig' && config.scanner[key].enabled && !config.scanner[key].discordRoles.length && !config.scanner[key].telegramGroups.length),
+ scanner: Object.keys(config.scanner).filter(
+ (key) =>
+ key !== 'backendConfig' &&
+ config.scanner[key].enabled &&
+ !config.scanner[key].discordRoles.length &&
+ !config.scanner[key].telegramGroups.length,
+ ),
}
- config.authentication.alwaysEnabledPerms.forEach(perm => {
+ config.authentication.alwaysEnabledPerms.forEach((perm) => {
if (config.authentication.perms[perm]) {
req.session.perms[perm] = true
} else {
- console.warn('[AUTH] Invalid Perm in "alwaysEnabledPerms" array:', perm)
+ console.warn(
+ '[AUTH] Invalid Perm in "alwaysEnabledPerms" array:',
+ perm,
+ )
}
})
req.session.save()
@@ -87,13 +111,24 @@ rootRouter.get('/settings', async (req, res) => {
const user = await User.query().findById(req.user.id)
if (user) {
delete user.password
- return { ...req.user, ...user, valid: true, username: user.username || req.user.username }
+ return {
+ ...req.user,
+ ...user,
+ valid: true,
+ username: user.username || req.user.username,
+ }
}
- console.log('[SESSION] Legacy user detected, forcing logout, User ID:', req?.user?.id)
+ console.log(
+ '[SESSION] Legacy user detected, forcing logout, User ID:',
+ req?.user?.id,
+ )
req.logout()
return { valid: false, tutorial: !config.map.forceTutorial }
} catch (e) {
- console.log('[SESSION] Issue finding user, forcing logout, User ID:', req?.user?.id)
+ console.log(
+ '[SESSION] Issue finding user, forcing logout, User ID:',
+ req?.user?.id,
+ )
req.logout()
return { valid: false, tutorial: !config.map.forceTutorial }
}
@@ -114,9 +149,15 @@ rootRouter.get('/settings', async (req, res) => {
excludeList: config.authentication.excludeFromTutorial,
polling: config.api.polling,
},
- localeSelection: Object.fromEntries(config.map.localeSelection.map(l => [l, { name: l }])),
- tileServers: Object.fromEntries(config.tileServers.map(s => [s.name, s])),
- navigation: Object.fromEntries(config.navigation.map(n => [n.name, n])),
+ localeSelection: Object.fromEntries(
+ config.map.localeSelection.map((l) => [l, { name: l }]),
+ ),
+ tileServers: Object.fromEntries(
+ config.tileServers.map((s) => [s.name, s]),
+ ),
+ navigation: Object.fromEntries(
+ config.navigation.map((n) => [n.name, n]),
+ ),
drawer: {
temporary: {},
persistent: {},
@@ -132,17 +173,21 @@ rootRouter.get('/settings', async (req, res) => {
enableScanNext: config.scanner.scanNext.enabled,
scanNextShowScanCount: config.scanner.scanNext.showScanCount,
scanNextShowScanQueue: config.scanner.scanNext.showScanQueue,
- scanNextAreaRestriction: config.scanner.scanNext.scanNextAreaRestriction,
+ scanNextAreaRestriction:
+ config.scanner.scanNext.scanNextAreaRestriction,
enableScanZone: config.scanner.scanZone.enabled,
scanZoneShowScanCount: config.scanner.scanZone.showScanCount,
scanZoneShowScanQueue: config.scanner.scanZone.showScanQueue,
- advancedScanZoneOptions: config.scanner.scanZone.advancedScanZoneOptions,
+ advancedScanZoneOptions:
+ config.scanner.scanZone.advancedScanZoneOptions,
scanZoneRadius: config.scanner.scanZone.scanZoneRadius,
scanZoneSpacing: config.scanner.scanZone.scanZoneSpacing,
scanZoneMaxSize: config.scanner.scanZone.scanZoneMaxSize,
- scanZoneAreaRestriction: config.scanner.scanZone.scanZoneAreaRestriction,
+ scanZoneAreaRestriction:
+ config.scanner.scanZone.scanZoneAreaRestriction,
},
- gymValidDataLimit: Date.now() / 1000 - (config.api.gymValidDataLimit * 86400),
+ gymValidDataLimit:
+ Date.now() / 1000 - config.api.gymValidDataLimit * 86400,
},
available: { pokemon: [], pokestops: [], gyms: [], nests: [] },
}
@@ -152,23 +197,37 @@ rootRouter.get('/settings', async (req, res) => {
serverSettings.loggedIn = req.user
// keys that are being sent to the frontend but are not options
- const ignoreKeys = ['map', 'manualAreas', 'limit', 'icons', 'scanner', 'gymValidDataLimit']
+ const ignoreKeys = [
+ 'map',
+ 'manualAreas',
+ 'limit',
+ 'icons',
+ 'scanner',
+ 'gymValidDataLimit',
+ ]
- Object.keys(serverSettings.config).forEach(setting => {
+ Object.keys(serverSettings.config).forEach((setting) => {
try {
if (!ignoreKeys.includes(setting)) {
const category = serverSettings.config[setting]
- Object.keys(category).forEach(option => {
+ Object.keys(category).forEach((option) => {
category[option].name = option
})
- if (config.map[setting] && typeof config.map[setting] !== 'object') {
+ if (
+ config.map[setting] &&
+ typeof config.map[setting] !== 'object'
+ ) {
serverSettings.settings[setting] = config.map[setting]
} else {
- serverSettings.settings[setting] = category[Object.keys(category)[0]].name
+ serverSettings.settings[setting] =
+ category[Object.keys(category)[0]].name
}
}
} catch (e) {
- console.warn(`Error setting ${setting}, most likely means there are no options set in the config`, e.message)
+ console.warn(
+ `Error setting ${setting}, most likely means there are no options set in the config`,
+ e.message,
+ )
}
})
@@ -182,11 +241,14 @@ rootRouter.get('/settings', async (req, res) => {
? await Db.getAvailable('Gym')
: Event.available.gyms
}
- if (serverSettings.user.perms.quests
- || serverSettings.user.perms.pokestops
- || serverSettings.user.perms.invasions
- || serverSettings.user.perms.lures) {
- serverSettings.available.pokestops = config.api.queryOnSessionInit.quests
+ if (
+ serverSettings.user.perms.quests ||
+ serverSettings.user.perms.pokestops ||
+ serverSettings.user.perms.invasions ||
+ serverSettings.user.perms.lures
+ ) {
+ serverSettings.available.pokestops = config.api.queryOnSessionInit
+ .quests
? await Db.getAvailable('Pokestop')
: Event.available.pokestops
serverSettings.available.withConditions = Db.questConditions
@@ -196,57 +258,101 @@ rootRouter.get('/settings', async (req, res) => {
? await Db.getAvailable('Nest')
: Event.available.nests
}
- if (Object.values(config.api.queryOnSessionInit).some(v => v)) {
+ if (Object.values(config.api.queryOnSessionInit).some((v) => v)) {
Event.addAvailable()
- serverSettings.masterfile = { ...Event.masterfile, invasions: Event.invasions }
+ serverSettings.masterfile = {
+ ...Event.masterfile,
+ invasions: Event.invasions,
+ }
}
- serverSettings.defaultFilters = Utility.buildDefaultFilters(serverSettings.user.perms, serverSettings.available)
+ serverSettings.defaultFilters = Utility.buildDefaultFilters(
+ serverSettings.user.perms,
+ serverSettings.available,
+ )
// Backup in case there are Pokemon/Quests/Raids etc that are not in the masterfile
// Primary for quest rewards that are form unset, despite normally have a set form
- serverSettings.ui = Utility.buildPrimaryUi(serverSettings.defaultFilters, serverSettings.user.perms)
+ serverSettings.ui = Utility.buildPrimaryUi(
+ serverSettings.defaultFilters,
+ serverSettings.user.perms,
+ )
serverSettings.menus = Utility.buildAdvMenus(serverSettings.available)
- const { clientValues, clientMenus } = Utility.buildClientOptions(serverSettings.user.perms)
+ const { clientValues, clientMenus } = Utility.buildClientOptions(
+ serverSettings.user.perms,
+ )
serverSettings.userSettings = clientValues
serverSettings.clientMenus = clientMenus
- if (config.webhooks.length && serverSettings.user?.perms?.webhooks?.length) {
+ if (
+ config.webhooks.length &&
+ serverSettings.user?.perms?.webhooks?.length
+ ) {
serverSettings.webhooks = {}
- const filtered = config.webhooks.filter(webhook => serverSettings.user.perms.webhooks.includes(webhook.name))
+ const filtered = config.webhooks.filter((webhook) =>
+ serverSettings.user.perms.webhooks.includes(webhook.name),
+ )
try {
- await Promise.all(filtered.map(async webhook => {
- if (webhook.enabled && Event.webhookObj?.[webhook.name]?.client?.valid) {
- const webhookId = Utility.evalWebhookId(serverSettings.user)
- const { strategy, webhookStrategy } = serverSettings.user
+ await Promise.all(
+ filtered.map(async (webhook) => {
+ if (
+ webhook.enabled &&
+ Event.webhookObj?.[webhook.name]?.client?.valid
+ ) {
+ const webhookId = Utility.evalWebhookId(serverSettings.user)
+ const { strategy, webhookStrategy } = serverSettings.user
- const remoteData = await Fetch.webhookApi('allProfiles', webhookId, 'GET', webhook.name)
- const { areas } = await Fetch.webhookApi('humans', webhookId, 'GET', webhook.name)
+ const remoteData = await Fetch.webhookApi(
+ 'allProfiles',
+ webhookId,
+ 'GET',
+ webhook.name,
+ )
+ const { areas } = await Fetch.webhookApi(
+ 'humans',
+ webhookId,
+ 'GET',
+ webhook.name,
+ )
- if (remoteData && areas) {
- serverSettings.webhooks[webhook.name] = remoteData.human.admin_disable
- ? Event.webhookObj[webhook.name].client
- : {
- ...Event.webhookObj[webhook.name].client,
- ...remoteData,
- hasNominatim: Boolean(Event.webhookObj[webhook.name].server.nominatimUrl),
- locale: remoteData.human.language || Event.webhookObj[webhook.name].client.locale,
- available: areas
- .sort((a, b) => a.name.localeCompare(b.name))
- .filter(area => area.userSelectable !== false)
- .map(area => area.name),
- templates: Event.webhookObj[webhook.name].client.templates[webhookStrategy || strategy],
- }
+ if (remoteData && areas) {
+ serverSettings.webhooks[webhook.name] = remoteData.human
+ .admin_disable
+ ? Event.webhookObj[webhook.name].client
+ : {
+ ...Event.webhookObj[webhook.name].client,
+ ...remoteData,
+ hasNominatim: Boolean(
+ Event.webhookObj[webhook.name].server.nominatimUrl,
+ ),
+ locale:
+ remoteData.human.language ||
+ Event.webhookObj[webhook.name].client.locale,
+ available: areas
+ .sort((a, b) => a.name.localeCompare(b.name))
+ .filter((area) => area.userSelectable !== false)
+ .map((area) => area.name),
+ templates:
+ Event.webhookObj[webhook.name].client.templates[
+ webhookStrategy || strategy
+ ],
+ }
+ }
}
- }
- }))
+ }),
+ )
} catch (e) {
serverSettings.webhooks = null
- console.warn('[AUTH]', e.message, 'Unable to fetch webhook data, this is unlikely an issue with ReactMap, check to make sure the user is registered in the webhook database. User ID:', serverSettings.user.id)
+ console.warn(
+ '[AUTH]',
+ e.message,
+ 'Unable to fetch webhook data, this is unlikely an issue with ReactMap, check to make sure the user is registered in the webhook database. User ID:',
+ serverSettings.user.id,
+ )
}
}
}
diff --git a/server/src/services/DbCheck.js b/server/src/services/DbCheck.js
index 6a774b173..6eff86f39 100644
--- a/server/src/services/DbCheck.js
+++ b/server/src/services/DbCheck.js
@@ -5,16 +5,18 @@ const extend = require('extend')
module.exports = class DbCheck {
constructor(validModels, dbSettings, queryDebug, apiSettings, distanceUnit) {
- this.validModels = validModels.flatMap(s => s.useFor)
+ this.validModels = validModels.flatMap((s) => s.useFor)
this.singleModels = ['User', 'Badge', 'Session']
this.searchLimit = apiSettings.searchLimit
this.models = {}
this.questConditions = {}
this.connections = dbSettings.schemas
- .filter(s => s.useFor.length)
+ .filter((s) => s.useFor.length)
.map((schema, i) => {
- schema.useFor.forEach(category => {
- const capital = `${category.charAt(0).toUpperCase()}${category.slice(1)}`
+ schema.useFor.forEach((category) => {
+ const capital = `${category.charAt(0).toUpperCase()}${category.slice(
+ 1,
+ )}`
if (!this.models[capital]) {
this.models[capital] = []
}
@@ -42,49 +44,68 @@ module.exports = class DbCheck {
}
static getDistance(args, isMad, distanceUnit) {
- return raw(`ROUND(( ${distanceUnit === 'mi' ? '3959' : '6371'} * acos( cos( radians(${args.lat}) ) * cos( radians( ${isMad ? 'latitude' : 'lat'} ) ) * cos( radians( ${isMad ? 'longitude' : 'lon'} ) - radians(${args.lon}) ) + sin( radians(${args.lat}) ) * sin( radians( ${isMad ? 'latitude' : 'lat'} ) ) ) ),2)`).as('distance')
+ return raw(
+ `ROUND(( ${
+ distanceUnit === 'mi' ? '3959' : '6371'
+ } * acos( cos( radians(${args.lat}) ) * cos( radians( ${
+ isMad ? 'latitude' : 'lat'
+ } ) ) * cos( radians( ${isMad ? 'longitude' : 'lon'} ) - radians(${
+ args.lon
+ }) ) + sin( radians(${args.lat}) ) * sin( radians( ${
+ isMad ? 'latitude' : 'lat'
+ } ) ) ) ),2)`,
+ ).as('distance')
}
async determineType() {
- console.log(`[DB] Determining database types for ${this.connections.length} connection${this.connections.length > 1 ? 's' : ''}`)
- await Promise.all(this.connections.map(async (schema, i) => {
- try {
- const [isMad, pvpV2] = await schema('pokemon').columnInfo()
- .then(columns => [
- 'cp_multiplier' in columns,
- 'pvp' in columns,
- ])
- const [hasRewardAmount, hasAltQuests] = await schema('pokestop').columnInfo()
- .then(columns => ([
- ('quest_reward_amount' in columns || isMad),
- 'alternative_quest_type' in columns,
- ]))
- const [hasMultiInvasions, multiInvasionMs] = await schema('incident').columnInfo()
- .then(columns => ([
- 'character' in columns,
- 'expiration_ms' in columns,
- ]))
- const [availableSlotsCol] = await schema('gym').columnInfo()
- .then(columns => ([
- 'availble_slots' in columns ? 'availble_slots' : 'available_slots',
- ]))
- Object.entries(this.models).forEach(([category, sources]) => {
- sources.forEach((source, j) => {
- if (source.connection === i) {
- this.models[category][j].isMad = isMad
- this.models[category][j].pvpV2 = pvpV2
- this.models[category][j].hasRewardAmount = hasRewardAmount
- this.models[category][j].hasAltQuests = hasAltQuests
- this.models[category][j].hasMultiInvasions = hasMultiInvasions
- this.models[category][j].multiInvasionMs = multiInvasionMs
- this.models[category][j].availableSlotsCol = availableSlotsCol
- }
+ console.log(
+ `[DB] Determining database types for ${
+ this.connections.length
+ } connection${this.connections.length > 1 ? 's' : ''}`,
+ )
+ await Promise.all(
+ this.connections.map(async (schema, i) => {
+ try {
+ const [isMad, pvpV2] = await schema('pokemon')
+ .columnInfo()
+ .then((columns) => ['cp_multiplier' in columns, 'pvp' in columns])
+ const [hasRewardAmount, hasAltQuests] = await schema('pokestop')
+ .columnInfo()
+ .then((columns) => [
+ 'quest_reward_amount' in columns || isMad,
+ 'alternative_quest_type' in columns,
+ ])
+ const [hasMultiInvasions, multiInvasionMs] = await schema('incident')
+ .columnInfo()
+ .then((columns) => [
+ 'character' in columns,
+ 'expiration_ms' in columns,
+ ])
+ const [availableSlotsCol] = await schema('gym')
+ .columnInfo()
+ .then((columns) => [
+ 'availble_slots' in columns
+ ? 'availble_slots'
+ : 'available_slots',
+ ])
+ Object.entries(this.models).forEach(([category, sources]) => {
+ sources.forEach((source, j) => {
+ if (source.connection === i) {
+ this.models[category][j].isMad = isMad
+ this.models[category][j].pvpV2 = pvpV2
+ this.models[category][j].hasRewardAmount = hasRewardAmount
+ this.models[category][j].hasAltQuests = hasAltQuests
+ this.models[category][j].hasMultiInvasions = hasMultiInvasions
+ this.models[category][j].multiInvasionMs = multiInvasionMs
+ this.models[category][j].availableSlotsCol = availableSlotsCol
+ }
+ })
})
- })
- } catch (e) {
- console.error('[DB]', e.message)
- }
- }))
+ } catch (e) {
+ console.error('[DB]', e.message)
+ }
+ }),
+ )
}
bindConnections(models) {
@@ -101,16 +122,24 @@ module.exports = class DbCheck {
models[model].knex(this.connections[sources[0].connection])
} else {
sources.forEach((source, i) => {
- this.models[model][i].SubModel = models[model].bindKnex(this.connections[source.connection])
+ this.models[model][i].SubModel = models[model].bindKnex(
+ this.connections[source.connection],
+ )
})
}
- console.log(`[DB] Bound ${model} to ${sources.length} connection${sources.length > 1 ? 's' : ''}`)
+ console.log(
+ `[DB] Bound ${model} to ${sources.length} connection${
+ sources.length > 1 ? 's' : ''
+ }`,
+ )
})
} catch (e) {
console.error(`
Error: ${e.message}
- Info: Only ${[this.validModels].join(', ')} are valid options in the useFor arrays
+ Info: Only ${[this.validModels].join(
+ ', ',
+ )} are valid options in the useFor arrays
`)
process.exit(9)
}
@@ -131,25 +160,38 @@ module.exports = class DbCheck {
}
async getAll(model, perms, args, userId, method = 'getAll') {
- const data = await Promise.all(this.models[model].map(async (source) => (
- source.SubModel[method](perms, args, source, userId)
- )))
+ const data = await Promise.all(
+ this.models[model].map(async (source) =>
+ source.SubModel[method](perms, args, source, userId),
+ ),
+ )
return DbCheck.deDupeResults(data)
}
async getOne(model, id, method = 'getOne') {
- const data = await Promise.all(this.models[model].map(async (source) => (
- source.SubModel[method](id, source)
- )))
+ const data = await Promise.all(
+ this.models[model].map(async (source) =>
+ source.SubModel[method](id, source),
+ ),
+ )
const cleaned = DbCheck.deDupeResults(data.filter(Boolean))
return (Array.isArray(cleaned) ? cleaned[0] : cleaned) || {}
}
async search(model, perms, args, method = 'search') {
- const data = await Promise.all(this.models[model].map(async (source) => (
- source.SubModel[method](perms, args, source, DbCheck.getDistance(args, source.isMad, this.distanceUnit))
- )))
- const deDuped = DbCheck.deDupeResults(data).sort((a, b) => a.distance - b.distance)
+ const data = await Promise.all(
+ this.models[model].map(async (source) =>
+ source.SubModel[method](
+ perms,
+ args,
+ source,
+ DbCheck.getDistance(args, source.isMad, this.distanceUnit),
+ ),
+ ),
+ )
+ const deDuped = DbCheck.deDupeResults(data).sort(
+ (a, b) => a.distance - b.distance,
+ )
if (deDuped.length > this.searchLimit) {
deDuped.length = this.searchLimit
}
@@ -157,12 +199,16 @@ module.exports = class DbCheck {
}
async submissionCells(args) {
- const stopData = await Promise.all(this.models.Pokestop.map(async (source) => (
- source.SubModel.getSubmissions(args, source)
- )))
- const gymData = await Promise.all(this.models.Gym.map(async (source) => (
- source.SubModel.getSubmissions(args, source)
- )))
+ const stopData = await Promise.all(
+ this.models.Pokestop.map(async (source) =>
+ source.SubModel.getSubmissions(args, source),
+ ),
+ )
+ const gymData = await Promise.all(
+ this.models.Gym.map(async (source) =>
+ source.SubModel.getSubmissions(args, source),
+ ),
+ )
return [DbCheck.deDupeResults(stopData), DbCheck.deDupeResults(gymData)]
}
@@ -170,18 +216,27 @@ module.exports = class DbCheck {
if (this.models[model]) {
console.log(`[DB] Querying available for ${model}`)
try {
- const results = await Promise.all(this.models[model].map(async (source) => (
- source.SubModel.getAvailable(source)
- )))
+ const results = await Promise.all(
+ this.models[model].map(async (source) =>
+ source.SubModel.getAvailable(source),
+ ),
+ )
console.log(`[DB] Setting available for ${model}`)
if (model === 'Pokestop') {
- results.forEach(result => {
+ results.forEach((result) => {
if ('conditions' in result) {
- this.questConditions = extend(true, this.questConditions, result.conditions)
+ this.questConditions = extend(
+ true,
+ this.questConditions,
+ result.conditions,
+ )
}
})
this.questConditions = Object.fromEntries(
- Object.entries(this.questConditions).map(([key, titles]) => [key, Object.values(titles)]),
+ Object.entries(this.questConditions).map(([key, titles]) => [
+ key,
+ Object.values(titles),
+ ]),
)
}
if (results.length === 1) return results[0].available
@@ -195,8 +250,17 @@ module.exports = class DbCheck {
return [...returnSet]
}
} catch (e) {
- console.warn('[WARN] Unable to query available for:', model, '\n', e.message)
- if (model === 'Nest') console.warn('[WARN] This is likely due to "nest" being in a useFor array but not in the database')
+ console.warn(
+ '[WARN] Unable to query available for:',
+ model,
+ '\n',
+ e.message,
+ )
+ if (model === 'Nest') {
+ console.warn(
+ '[WARN] This is likely due to "nest" being in a useFor array but not in the database',
+ )
+ }
return []
}
}
diff --git a/server/src/services/DiscordClient.js b/server/src/services/DiscordClient.js
index 089b21070..4e7d31275 100644
--- a/server/src/services/DiscordClient.js
+++ b/server/src/services/DiscordClient.js
@@ -6,7 +6,11 @@
/* eslint-disable import/no-dynamic-require */
/* global BigInt */
const fs = require('fs')
-const { authentication: { alwaysEnabledPerms }, scanner, webhooks } = require('./config')
+const {
+ authentication: { alwaysEnabledPerms },
+ scanner,
+ webhooks,
+} = require('./config')
const Utility = require('./Utility')
module.exports = class DiscordMapClient {
@@ -25,15 +29,19 @@ module.exports = class DiscordMapClient {
try {
const members = await this.client.guilds.cache
.get(guildId)
- .members
- .fetch()
+ .members.fetch()
const member = members.get(userId)
const roles = member.roles.cache
- .filter(x => BigInt(x.id).toString())
+ .filter((x) => BigInt(x.id).toString())
.keyArray()
return roles
} catch (e) {
- console.error('[DISCORD] Failed to get roles in guild', guildId, 'for user', userId)
+ console.error(
+ '[DISCORD] Failed to get roles in guild',
+ guildId,
+ 'for user',
+ userId,
+ )
}
return []
}
@@ -55,25 +63,31 @@ module.exports = class DiscordMapClient {
}
async getPerms(user) {
- const perms = Object.fromEntries(Object.keys(this.config.perms).map(x => [x, false]))
+ const perms = Object.fromEntries(
+ Object.keys(this.config.perms).map((x) => [x, false]),
+ )
perms.areaRestrictions = []
perms.webhooks = []
perms.scanner = []
try {
const { guildsFull } = user
- const guilds = user.guilds.map(guild => guild.id)
+ const guilds = user.guilds.map((guild) => guild.id)
if (this.config.allowedUsers.includes(user.id)) {
- Object.keys(perms).forEach((key) => perms[key] = true)
+ Object.keys(perms).forEach((key) => (perms[key] = true))
perms.areaRestrictions = []
- perms.webhooks = webhooks.map(x => x.name)
- perms.scanner = Object.keys(scanner).map(x => x !== 'backendConfig' && scanner[x].enabled && x).filter(x => x !== false)
- console.log(`[DISCORD] User ${user.username}#${user.discriminator} (${user.id}) in allowed users list, skipping guild and role check.`)
+ perms.webhooks = webhooks.map((x) => x.name)
+ perms.scanner = Object.keys(scanner)
+ .map((x) => x !== 'backendConfig' && scanner[x].enabled && x)
+ .filter((x) => x !== false)
+ console.log(
+ `[DISCORD] User ${user.username}#${user.discriminator} (${user.id}) in allowed users list, skipping guild and role check.`,
+ )
return perms
}
for (let i = 0; i < this.config.blockedGuilds.length; i += 1) {
const guildId = this.config.blockedGuilds[i]
if (guilds.includes(guildId)) {
- perms.blocked = guildsFull.find(x => x.id === guildId).name
+ perms.blocked = guildsFull.find((x) => x.id === guildId).name
return perms
}
}
@@ -98,8 +112,12 @@ module.exports = class DiscordMapClient {
}
}
}
- perms.areaRestrictions.push(...Utility.areaPerms(userRoles, 'discord'))
- perms.webhooks.push(...Utility.webhookPerms(userRoles, 'discordRoles'))
+ perms.areaRestrictions.push(
+ ...Utility.areaPerms(userRoles, 'discord'),
+ )
+ perms.webhooks.push(
+ ...Utility.webhookPerms(userRoles, 'discordRoles'),
+ )
perms.scanner.push(...Utility.scannerPerms(userRoles, 'discordRoles'))
}
}
@@ -120,9 +138,7 @@ module.exports = class DiscordMapClient {
return
}
try {
- const channel = await this.client.channels.cache
- .get(channelId)
- .fetch()
+ const channel = await this.client.channels.cache.get(channelId).fetch()
if (channel && message) {
channel.send(message)
}
diff --git a/server/src/services/EventManager.js b/server/src/services/EventManager.js
index 7f5b4f3f9..1f506f67c 100644
--- a/server/src/services/EventManager.js
+++ b/server/src/services/EventManager.js
@@ -13,7 +13,8 @@ module.exports = class EventManager {
this.invasions = masterfile.invasions
this.available = { gyms: [], pokestops: [], pokemon: [], nests: [] }
this.uicons = []
- this.baseUrl = 'https://raw.githubusercontent.com/WatWowMap/wwm-uicons/main/'
+ this.baseUrl =
+ 'https://raw.githubusercontent.com/WatWowMap/wwm-uicons/main/'
this.webhookObj = {}
}
@@ -64,7 +65,7 @@ module.exports = class EventManager {
async getUicons(styles) {
console.log('[EVENT] Fetching Latest UICONS')
- if (!styles.some(icon => icon.path === this.baseUrl)) {
+ if (!styles.some((icon) => icon.path === this.baseUrl)) {
styles.push({
name: 'Base',
path: this.baseUrl,
@@ -82,42 +83,68 @@ module.exports = class EventManager {
},
})
}
- this.uicons = await Promise.all(styles.map(async style => {
- try {
- const response = style.path.startsWith('http')
- ? await fetchJson(`${style.path}/index.json`)
- : JSON.parse(await fs.readFile(path.resolve(__dirname, `../../../public/images/uicons/${style.path}/index.json`)))
- return { ...style, data: response }
- } catch (e) {
- console.warn('[WARN] Failed to generate latest uicons for:', style, '\n', e.message)
- console.warn(`[WARN] Make sure the path follows one of these two formats: \n\tRemote: ${this.baseUrl}\n\tLocal: wwm-uicons (And the uicons folder is found at /public/images/uicons/wwm-uicons/)`)
- }
- }))
+ this.uicons = await Promise.all(
+ styles.map(async (style) => {
+ try {
+ const response = style.path.startsWith('http')
+ ? await fetchJson(`${style.path}/index.json`)
+ : JSON.parse(
+ await fs.readFile(
+ path.resolve(
+ __dirname,
+ `../../../public/images/uicons/${style.path}/index.json`,
+ ),
+ ),
+ )
+ return { ...style, data: response }
+ } catch (e) {
+ console.warn(
+ '[WARN] Failed to generate latest uicons for:',
+ style,
+ '\n',
+ e.message,
+ )
+ console.warn(
+ `[WARN] Make sure the path follows one of these two formats: \n\tRemote: ${this.baseUrl}\n\tLocal: wwm-uicons (And the uicons folder is found at /public/images/uicons/wwm-uicons/)`,
+ )
+ }
+ }),
+ )
this.uicons = this.uicons.filter(Boolean)
}
async getInvasions() {
console.log('[EVENT] Fetching Latest Invasions')
try {
- this.invasions = await fetchJson('https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/grunts.json')
- .then(response => response ? Object.fromEntries(
- Object.entries(this.invasions).map(([type, info]) => {
- const latest = response[type]
- const newInvasion = this.invasions[type]
- if (info.encounters) {
- Object.keys(info.encounters).forEach((position, i) => {
- if (latest?.active) {
- newInvasion.encounters[position] = latest.lineup.team[i].map((pkmn, j) => (
- pkmn.template === 'UNSET' && info.encounters[position][j]
- ? info.encounters[position][j]
- : { id: pkmn.id, form: pkmn.form }))
- newInvasion.second_reward = latest.lineup.rewards.length > 1
+ this.invasions = await fetchJson(
+ 'https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/grunts.json',
+ ).then((response) =>
+ response
+ ? Object.fromEntries(
+ Object.entries(this.invasions).map(([type, info]) => {
+ const latest = response[type]
+ const newInvasion = this.invasions[type]
+ if (info.encounters) {
+ Object.keys(info.encounters).forEach((position, i) => {
+ if (latest?.active) {
+ newInvasion.encounters[position] = latest.lineup.team[
+ i
+ ].map((pkmn, j) =>
+ pkmn.template === 'UNSET' &&
+ info.encounters[position][j]
+ ? info.encounters[position][j]
+ : { id: pkmn.id, form: pkmn.form },
+ )
+ newInvasion.second_reward =
+ latest.lineup.rewards.length > 1
+ }
+ })
}
- })
- }
- return [type, newInvasion]
- }),
- ) : this.invasions)
+ return [type, newInvasion]
+ }),
+ )
+ : this.invasions,
+ )
} catch (e) {
console.warn('[WARN] Unable to generate latest invasions:\n', e.message)
}
@@ -136,7 +163,7 @@ module.exports = class EventManager {
addAvailable() {
Object.entries(this.available).forEach(([category, entries]) => {
- entries.forEach(item => {
+ entries.forEach((item) => {
if (!Number.isNaN(parseInt(item.charAt(0)))) {
const [id, form] = item.split('-')
if (!this.masterfile.pokemon[id]) {
@@ -153,7 +180,9 @@ module.exports = class EventManager {
}
if (!this.masterfile.pokemon[id].forms[form]) {
this.masterfile.pokemon[id].forms[form] = { name: '*', category }
- console.log(`[MF] Added ${this.masterfile.pokemon[id].name} Key: ${item} to masterfile. (${category})`)
+ console.log(
+ `[MF] Added ${this.masterfile.pokemon[id].name} Key: ${item} to masterfile. (${category})`,
+ )
}
}
})
@@ -161,8 +190,13 @@ module.exports = class EventManager {
}
async getWebhooks(config) {
- await Promise.all(config.webhooks.map(async webhook => {
- this.webhookObj = { ...this.webhookObj, [webhook.name]: await initWebhooks(webhook, config) }
- }))
+ await Promise.all(
+ config.webhooks.map(async (webhook) => {
+ this.webhookObj = {
+ ...this.webhookObj,
+ [webhook.name]: await initWebhooks(webhook, config),
+ }
+ }),
+ )
}
}
diff --git a/server/src/services/PvpWrapper.js b/server/src/services/PvpWrapper.js
index 6d09789ee..64e51e9ae 100644
--- a/server/src/services/PvpWrapper.js
+++ b/server/src/services/PvpWrapper.js
@@ -10,9 +10,8 @@ module.exports = class PvpWrapper extends Ohbem {
levelCaps: config.levels,
cachingStrategy: Ohbem.cachingStrategies.memoryHeavy,
})
- this.rmCache = new NodeCache({ stdTTL: 60 * 60 * 1.5 });
-
- (async () => {
+ this.rmCache = new NodeCache({ stdTTL: 60 * 60 * 1.5 })
+ ;(async () => {
this.updatePokemonData(await Ohbem.fetchPokemonData())
})()
}
@@ -36,7 +35,13 @@ module.exports = class PvpWrapper extends Ohbem {
this.rmCache.set(key, result, pokemon.expire_timestamp - currentTs)
return result
} catch (e) {
- console.error('[PKMN] Unable to process PVP Stats for Pokemon with ID#: ', pokemon.id, `#${pokemon.pokemon_id} - ${pokemon.form}`, '\n', e.message)
+ console.error(
+ '[PKMN] Unable to process PVP Stats for Pokemon with ID#: ',
+ pokemon.id,
+ `#${pokemon.pokemon_id} - ${pokemon.form}`,
+ '\n',
+ e.message,
+ )
return {}
}
}
diff --git a/server/src/services/api/fetchJson.js b/server/src/services/api/fetchJson.js
index 81d88b439..1e9946967 100644
--- a/server/src/services/api/fetchJson.js
+++ b/server/src/services/api/fetchJson.js
@@ -2,7 +2,11 @@
const fetch = require('node-fetch')
const { AbortError } = require('node-fetch')
-module.exports = async function fetchJson(url, options = undefined, log = false) {
+module.exports = async function fetchJson(
+ url,
+ options = undefined,
+ log = false,
+) {
const controller = new AbortController()
const timeout = setTimeout(() => {
diff --git a/server/src/services/api/fetchNests.js b/server/src/services/api/fetchNests.js
index 7c60e8a5b..4c7a08eca 100644
--- a/server/src/services/api/fetchNests.js
+++ b/server/src/services/api/fetchNests.js
@@ -1,12 +1,19 @@
/* eslint-disable no-console */
const fetchJson = require('./fetchJson')
-const { api: { nestHemisphere } } = require('../config')
+const {
+ api: { nestHemisphere },
+} = require('../config')
const { Event } = require('../initialization')
module.exports = async function fetchNests() {
try {
- const { [nestHemisphere]: nesting } = await fetchJson('https://raw.githubusercontent.com/ccev/pogoinfo/v2/nests/species-ids.json')
- return nesting.map(pokemon => `${pokemon}-${Event.masterfile.pokemon[pokemon].defaultFormId}`)
+ const { [nestHemisphere]: nesting } = await fetchJson(
+ 'https://raw.githubusercontent.com/ccev/pogoinfo/v2/nests/species-ids.json',
+ )
+ return nesting.map(
+ (pokemon) =>
+ `${pokemon}-${Event.masterfile.pokemon[pokemon].defaultFormId}`,
+ )
} catch (e) {
console.warn(e, '\nUnable to fetch available nests from GitHub')
return []
diff --git a/server/src/services/api/fetchQuests.js b/server/src/services/api/fetchQuests.js
index 21f02241d..7d07bc8de 100644
--- a/server/src/services/api/fetchQuests.js
+++ b/server/src/services/api/fetchQuests.js
@@ -4,22 +4,39 @@ const { Event } = require('../initialization')
module.exports = async function fetchQuests() {
try {
- const quests = await fetchJson('https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/quests.json')
- const grunts = await fetchJson('https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/grunts.json')
+ const quests = await fetchJson(
+ 'https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/quests.json',
+ )
+ const grunts = await fetchJson(
+ 'https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/grunts.json',
+ )
const questsInfo = []
- Object.values(quests).forEach(questType => {
- questType.forEach(task => {
- task.rewards.forEach(reward => {
+ Object.values(quests).forEach((questType) => {
+ questType.forEach((task) => {
+ task.rewards.forEach((reward) => {
switch (reward.type) {
- case 'stardust': questsInfo.push(`d${reward.amount}`); break
- case 'item': questsInfo.push(`q${reward.id}`); break
- case 'energy': questsInfo.push(`m${reward.reward.id}-${reward.amount}`); break
- default: questsInfo.push(`${reward.reward.id}-${reward.reward.form || Event.masterfile.pokemon[reward.reward.id].defaultFormId}`); break
+ case 'stardust':
+ questsInfo.push(`d${reward.amount}`)
+ break
+ case 'item':
+ questsInfo.push(`q${reward.id}`)
+ break
+ case 'energy':
+ questsInfo.push(`m${reward.reward.id}-${reward.amount}`)
+ break
+ default:
+ questsInfo.push(
+ `${reward.reward.id}-${
+ reward.reward.form ||
+ Event.masterfile.pokemon[reward.reward.id].defaultFormId
+ }`,
+ )
+ break
}
})
})
})
- Object.keys(grunts).forEach(grunt => {
+ Object.keys(grunts).forEach((grunt) => {
if (grunts[grunt].active) {
questsInfo.push(`i${grunt}`)
}
@@ -29,7 +46,10 @@ module.exports = async function fetchQuests() {
}
return questsInfo
} catch (e) {
- console.warn(e, '\nUnable to fetch available quests and invasions from GitHub')
+ console.warn(
+ e,
+ '\nUnable to fetch available quests and invasions from GitHub',
+ )
return []
}
}
diff --git a/server/src/services/api/fetchRaids.js b/server/src/services/api/fetchRaids.js
index e0d34373c..3331354ba 100644
--- a/server/src/services/api/fetchRaids.js
+++ b/server/src/services/api/fetchRaids.js
@@ -4,12 +4,20 @@ const { Event } = require('../initialization')
module.exports = async function fetchRaids() {
try {
- const pogoInfoResults = await fetchJson('https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/raids.json')
+ const pogoInfoResults = await fetchJson(
+ 'https://raw.githubusercontent.com/ccev/pogoinfo/v2/active/raids.json',
+ )
const raidsInfo = []
- Object.entries(pogoInfoResults).forEach(raidTier => {
+ Object.entries(pogoInfoResults).forEach((raidTier) => {
const [egg, bosses] = raidTier
raidsInfo.push(`e${egg}`, `r${egg}`)
- bosses.forEach(boss => raidsInfo.push(`${boss.id}-${boss.form || Event.masterfile.pokemon[boss.id].defaultFormId}`))
+ bosses.forEach((boss) =>
+ raidsInfo.push(
+ `${boss.id}-${
+ boss.form || Event.masterfile.pokemon[boss.id].defaultFormId
+ }`,
+ ),
+ )
})
return raidsInfo
} catch (e) {
diff --git a/server/src/services/api/resolveQuickHook.js b/server/src/services/api/resolveQuickHook.js
index d89e05a7d..a51315989 100644
--- a/server/src/services/api/resolveQuickHook.js
+++ b/server/src/services/api/resolveQuickHook.js
@@ -4,50 +4,72 @@ const { Event } = require('../initialization')
const getWildCards = (category, gymBattles) => {
switch (category) {
- case 'gym': return { team: 4, slot_changes: true, battle_changes: gymBattles }
+ case 'gym':
+ return { team: 4, slot_changes: true, battle_changes: gymBattles }
case 'egg':
- case 'raid': return { level: 90 }
- default: return {}
+ case 'raid':
+ return { level: 90 }
+ default:
+ return {}
}
}
-module.exports = async function resolveQuickHook(category, discordId, webhookName, data) {
+module.exports = async function resolveQuickHook(
+ category,
+ discordId,
+ webhookName,
+ data,
+) {
const webhook = Event.webhookObj[webhookName]
try {
switch (category) {
- case 'quickGym': {
- const subCategories = ['raid', 'egg', 'gym']
- await Promise.all(subCategories.map(async subCategory => {
- const post = await fetchJson(`${webhook.server.host}:${webhook.server.port}/api/tracking/${subCategory}/${discordId}`, {
- method: 'POST',
- body: JSON.stringify({
- ...webhook.client.info[subCategory].defaults,
- ...getWildCards(subCategory, webhook.client.gymBattles),
- gym_id: data.id,
+ case 'quickGym':
+ {
+ const subCategories = ['raid', 'egg', 'gym']
+ await Promise.all(
+ subCategories.map(async (subCategory) => {
+ const post = await fetchJson(
+ `${webhook.server.host}:${webhook.server.port}/api/tracking/${subCategory}/${discordId}`,
+ {
+ method: 'POST',
+ body: JSON.stringify({
+ ...webhook.client.info[subCategory].defaults,
+ ...getWildCards(subCategory, webhook.client.gymBattles),
+ gym_id: data.id,
+ }),
+ headers: {
+ 'X-Poracle-Secret': webhook.server.poracleSecret,
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ },
+ },
+ )
+ if (!post) {
+ throw new Error(`Failed to post ${subCategory} webhook`)
+ }
}),
- headers: {
- 'X-Poracle-Secret': webhook.server.poracleSecret,
- Accept: 'application/json',
- 'Content-Type': 'application/json',
- },
- })
- if (!post) {
- throw new Error(`Failed to post ${subCategory} webhook`)
- }
- }))
- } break
- default: break
+ )
+ }
+ break
+ default:
+ break
}
return {
- ...await fetchJson(`${webhook.server.host}:${webhook.server.port}/api/tracking/allProfiles/${discordId}`, {
- method: 'GET',
- headers: { 'X-Poracle-Secret': webhook.server.poracleSecret },
- }),
+ ...(await fetchJson(
+ `${webhook.server.host}:${webhook.server.port}/api/tracking/allProfiles/${discordId}`,
+ {
+ method: 'GET',
+ headers: { 'X-Poracle-Secret': webhook.server.poracleSecret },
+ },
+ )),
status: 'success',
message: 'Success',
}
} catch (e) {
- console.log(e.message, 'There was a problem processing that webhook request')
+ console.log(
+ e.message,
+ 'There was a problem processing that webhook request',
+ )
return { status: 'error', message: e.message }
}
}
diff --git a/server/src/services/api/scannerApi.js b/server/src/services/api/scannerApi.js
index 4b2e67062..dce481ab8 100644
--- a/server/src/services/api/scannerApi.js
+++ b/server/src/services/api/scannerApi.js
@@ -20,48 +20,114 @@ module.exports = async function scannerApi(category, method, data = null) {
const headers = {}
switch (config.scanner.backendConfig.platform) {
case 'mad':
- case 'rdm': Object.assign(headers, { Authorization: `Basic ${Buffer.from(`${config.scanner.backendConfig.apiUsername}:${config.scanner.backendConfig.apiPassword}`).toString('base64')}` }); break
- default: break
+ case 'rdm':
+ Object.assign(headers, {
+ Authorization: `Basic ${Buffer.from(
+ `${config.scanner.backendConfig.apiUsername}:${config.scanner.backendConfig.apiPassword}`,
+ ).toString('base64')}`,
+ })
+ break
+ default:
+ break
}
const payloadObj = {}
switch (category) {
- case 'scanNext': {
- console.log(`[scannerApi] Request to scan new location by ${data.username}${data.userId ? ` (${data.userId})` : ''} - type ${data.scanNextType}: ${data.scanNextLocation[0].toFixed(5)},${data.scanNextLocation[1].toFixed(5)}`)
- const coords = config.scanner.backendConfig.platform === 'mad' ? `${parseFloat(data.scanNextCoords[0][0].toFixed(5))},${parseFloat(data.scanNextCoords[0][1].toFixed(5))}`
- : JSON.stringify(data.scanNextCoords.map(coord => (
- { lat: parseFloat(coord[0].toFixed(5)), lon: parseFloat(coord[1].toFixed(5)) })))
- Object.assign(payloadObj, {
- url: config.scanner.backendConfig.platform === 'mad' ? `${config.scanner.backendConfig.apiEndpoint}/send_gps?origin=${encodeURIComponent(config.scanner.scanNext.scanNextDevice)}&coords=${coords}&sleeptime=${config.scanner.scanNext.scanNextSleeptime}`
- : `${config.scanner.backendConfig.apiEndpoint}/set_data?scan_next=true&instance=${encodeURIComponent(config.scanner.scanNext.scanNextInstance)}&coords=${coords}`,
- options: { method, headers },
- })
- } break
- case 'scanZone': {
- console.log(`[scannerApi] Request to scan new zone by ${data.username}${data.userId ? ` (${data.userId})` : ''} - size ${data.scanZoneSize}: ${data.scanZoneLocation[0].toFixed(5)},${data.scanZoneLocation[1].toFixed(5)}`)
- const coords = JSON.stringify(data.scanZoneCoords.map(coord => (
- { lat: parseFloat(coord[0].toFixed(5)), lon: parseFloat(coord[1].toFixed(5)) })))
- Object.assign(payloadObj, {
- url: `${config.scanner.backendConfig.apiEndpoint}/set_data?scan_next=true&instance=${encodeURIComponent(config.scanner.scanZone.scanZoneInstance)}&coords=${coords}`,
- options: { method, headers },
- })
- } break
+ case 'scanNext':
+ {
+ console.log(
+ `[scannerApi] Request to scan new location by ${data.username}${
+ data.userId ? ` (${data.userId})` : ''
+ } - type ${data.scanNextType}: ${data.scanNextLocation[0].toFixed(
+ 5,
+ )},${data.scanNextLocation[1].toFixed(5)}`,
+ )
+ const coords =
+ config.scanner.backendConfig.platform === 'mad'
+ ? `${parseFloat(
+ data.scanNextCoords[0][0].toFixed(5),
+ )},${parseFloat(data.scanNextCoords[0][1].toFixed(5))}`
+ : JSON.stringify(
+ data.scanNextCoords.map((coord) => ({
+ lat: parseFloat(coord[0].toFixed(5)),
+ lon: parseFloat(coord[1].toFixed(5)),
+ })),
+ )
+ Object.assign(payloadObj, {
+ url:
+ config.scanner.backendConfig.platform === 'mad'
+ ? `${
+ config.scanner.backendConfig.apiEndpoint
+ }/send_gps?origin=${encodeURIComponent(
+ config.scanner.scanNext.scanNextDevice,
+ )}&coords=${coords}&sleeptime=${
+ config.scanner.scanNext.scanNextSleeptime
+ }`
+ : `${
+ config.scanner.backendConfig.apiEndpoint
+ }/set_data?scan_next=true&instance=${encodeURIComponent(
+ config.scanner.scanNext.scanNextInstance,
+ )}&coords=${coords}`,
+ options: { method, headers },
+ })
+ }
+ break
+ case 'scanZone':
+ {
+ console.log(
+ `[scannerApi] Request to scan new zone by ${data.username}${
+ data.userId ? ` (${data.userId})` : ''
+ } - size ${data.scanZoneSize}: ${data.scanZoneLocation[0].toFixed(
+ 5,
+ )},${data.scanZoneLocation[1].toFixed(5)}`,
+ )
+ const coords = JSON.stringify(
+ data.scanZoneCoords.map((coord) => ({
+ lat: parseFloat(coord[0].toFixed(5)),
+ lon: parseFloat(coord[1].toFixed(5)),
+ })),
+ )
+ Object.assign(payloadObj, {
+ url: `${
+ config.scanner.backendConfig.apiEndpoint
+ }/set_data?scan_next=true&instance=${encodeURIComponent(
+ config.scanner.scanZone.scanZoneInstance,
+ )}&coords=${coords}`,
+ options: { method, headers },
+ })
+ }
+ break
case 'getQueue':
- if (scannerQueue[data.typeName].timestamp
- > (Date.now() - config.scanner.backendConfig.queueRefreshInterval * 1000)) {
- console.log(`[scannerApi] Returning queue from memory for method ${data.typeName}: ${scannerQueue[data.typeName].queue}`)
+ if (
+ scannerQueue[data.typeName].timestamp >
+ Date.now() - config.scanner.backendConfig.queueRefreshInterval * 1000
+ ) {
+ console.log(
+ `[scannerApi] Returning queue from memory for method ${
+ data.typeName
+ }: ${scannerQueue[data.typeName].queue}`,
+ )
return { status: 'ok', message: scannerQueue[data.typeName].queue }
}
console.log(`[scannerApi] Getting queue for method ${data.typeName}`)
Object.assign(payloadObj, {
- url: `${config.scanner.backendConfig.apiEndpoint}/get_data?${data.type}=true&queue_size=true&instance=${encodeURIComponent(config.scanner[data.typeName][`${data.typeName}Instance`])}`,
+ url: `${config.scanner.backendConfig.apiEndpoint}/get_data?${
+ data.type
+ }=true&queue_size=true&instance=${encodeURIComponent(
+ config.scanner[data.typeName][`${data.typeName}Instance`],
+ )}`,
options: { method, headers },
- }); break
+ })
+ break
default:
- console.warn('[scannerApi] Api call without category'); break
+ console.warn('[scannerApi] Api call without category')
+ break
}
if (payloadObj.options.body) {
- Object.assign(payloadObj.options.headers, { Accept: 'application/json', 'Content-Type': 'application/json' })
+ Object.assign(payloadObj.options.headers, {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ })
}
const scannerResponse = await fetch(payloadObj.url, payloadObj.options)
@@ -71,26 +137,49 @@ module.exports = async function scannerApi(category, method, data = null) {
if (scannerResponse.status === 200 && category === 'getQueue') {
const { data: queueData } = await scannerResponse.json()
- console.log(`[scannerApi] Returning received queue for method ${data.typeName}: ${queueData.size}`)
- scannerQueue[data.typeName] = { queue: queueData.size, timestamp: Date.now() }
+ console.log(
+ `[scannerApi] Returning received queue for method ${data.typeName}: ${queueData.size}`,
+ )
+ scannerQueue[data.typeName] = {
+ queue: queueData.size,
+ timestamp: Date.now(),
+ }
return { status: 'ok', message: queueData.size }
}
switch (scannerResponse.status) {
case 200:
- console.log(`[scannerApi] Request from ${data.username}${data.userId ? ` (${data.userId})` : ''} successful`)
+ console.log(
+ `[scannerApi] Request from ${data.username}${
+ data.userId ? ` (${data.userId})` : ''
+ } successful`,
+ )
return { status: 'ok', message: 'scanner_ok' }
case 401:
- console.log('[scannerApi] Wrong credentials - check your scanner API settings in config')
+ console.log(
+ '[scannerApi] Wrong credentials - check your scanner API settings in config',
+ )
return { status: 'error', message: 'scanner_wrong_credentials' }
case 404:
- console.log(`[scannerApi] Error: instance ${config.scanner[category][`${category}Instance`]} does not exist`)
+ console.log(
+ `[scannerApi] Error: instance ${
+ config.scanner[category][`${category}Instance`]
+ } does not exist`,
+ )
return { status: 'error', message: 'scanner_no_instance' }
case 416:
- console.log(`[scannerApi] Error: instance ${config.scanner[category][`${category}Instance`]} has no device assigned`)
+ console.log(
+ `[scannerApi] Error: instance ${
+ config.scanner[category][`${category}Instance`]
+ } has no device assigned`,
+ )
return { status: 'error', message: 'scanner_no_device_assigned' }
case 500:
- console.log(`[scannerApi] Error: device ${config.scanner[category][`${category}Device`]} does not exist`)
+ console.log(
+ `[scannerApi] Error: device ${
+ config.scanner[category][`${category}Device`]
+ } does not exist`,
+ )
return { status: 'error', message: 'scanner_no_device' }
default:
return { status: 'error', message: 'scanner_error' }
@@ -99,7 +188,9 @@ module.exports = async function scannerApi(category, method, data = null) {
if (e instanceof AbortError) {
console.log('Request to the scanner timed out and was aborted')
} else {
- console.log('[scannerApi] There was a problem processing that scanner request')
+ console.log(
+ '[scannerApi] There was a problem processing that scanner request',
+ )
}
return { status: 'error', message: 'scanner_error' }
} finally {
diff --git a/server/src/services/api/webhookApi.js b/server/src/services/api/webhookApi.js
index 421c9c712..16985ce77 100644
--- a/server/src/services/api/webhookApi.js
+++ b/server/src/services/api/webhookApi.js
@@ -4,7 +4,13 @@ const resolveQuickHook = require('./resolveQuickHook')
const fetchJson = require('./fetchJson')
const { Event } = require('../initialization')
-module.exports = async function webhookApi(category, discordId, method, webhookName, data = null) {
+module.exports = async function webhookApi(
+ category,
+ discordId,
+ method,
+ webhookName,
+ data = null,
+) {
try {
const webhook = Event.webhookObj[webhookName]?.server
if (!webhook) {
@@ -12,8 +18,11 @@ module.exports = async function webhookApi(category, discordId, method, webhookN
}
const headers = {}
switch (webhook.provider) {
- case 'poracle': Object.assign(headers, { 'X-Poracle-Secret': webhook.poracleSecret }); break
- default: break
+ case 'poracle':
+ Object.assign(headers, { 'X-Poracle-Secret': webhook.poracleSecret })
+ break
+ default:
+ break
}
const payloadObj = {}
switch (category) {
@@ -21,53 +30,74 @@ module.exports = async function webhookApi(category, discordId, method, webhookN
case 'stop':
case 'switchProfile':
Object.assign(payloadObj, {
- url: `${webhook.host}:${webhook.port}/api/humans/${discordId}/${category}${data ? `/${data}` : ''}`,
+ url: `${webhook.host}:${
+ webhook.port
+ }/api/humans/${discordId}/${category}${data ? `/${data}` : ''}`,
options: { method, headers },
get: 'human',
- }); break
+ })
+ break
case 'setLocation':
Object.assign(payloadObj, {
url: `${webhook.host}:${webhook.port}/api/humans/${discordId}/${category}/${data[0]}/${data[1]}`,
options: { method, headers },
get: 'human',
- }); break
+ })
+ break
case 'setAreas':
Object.assign(payloadObj, {
url: `${webhook.host}:${webhook.port}/api/humans/${discordId}/${category}`,
options: {
- method, headers, body: JSON.stringify(data),
+ method,
+ headers,
+ body: JSON.stringify(data),
},
get: 'human',
- }); break
+ })
+ break
case 'geojson':
Object.assign(payloadObj, {
url: `${webhook.host}:${webhook.port}/api/geofence/all/${category}`,
options: { method, headers },
- }); break
+ })
+ break
case 'areaSecurity':
Object.assign(payloadObj, {
url: `${webhook.host}:${webhook.port}/api/geofence/${discordId}`,
options: { method, headers },
- }); break
+ })
+ break
case 'humans':
Object.assign(payloadObj, {
url: `${webhook.host}:${webhook.port}/api/humans/${discordId}`,
options: { method, headers },
- }); break
+ })
+ break
case 'profiles-add':
case 'profiles-byProfileNo':
case 'profiles-update':
case 'profiles-copy':
- case 'profiles': {
- const [main, sub] = category.split('-')
- Object.assign(payloadObj, {
- url: `${webhook.host}:${webhook.port}/api/${main}/${discordId}/${sub}${sub === 'copy' ? `/${data.from}/${data.to}` : ''}${method === 'DELETE' ? `/${data}` : ''}`,
- options: {
- method, headers, body: method === 'POST' && category !== 'profiles-copy' ? JSON.stringify(data) : undefined,
- },
- get: main,
- })
- } break
+ case 'profiles':
+ {
+ const [main, sub] = category.split('-')
+ Object.assign(payloadObj, {
+ url: `${webhook.host}:${
+ webhook.port
+ }/api/${main}/${discordId}/${sub}${
+ sub === 'copy' ? `/${data.from}/${data.to}` : ''
+ }${method === 'DELETE' ? `/${data}` : ''}`,
+ options: {
+ method,
+ headers,
+ body:
+ method === 'POST' && category !== 'profiles-copy'
+ ? JSON.stringify(data)
+ : undefined,
+ },
+ get: main,
+ })
+ }
+ break
case 'egg-delete':
case 'invasion-delete':
case 'lure-delete':
@@ -75,16 +105,20 @@ module.exports = async function webhookApi(category, discordId, method, webhookN
case 'pokemon-delete':
case 'quest-delete':
case 'raid-delete':
- case 'gym-delete': {
- const [main, sub] = category.split('-')
- Object.assign(payloadObj, {
- url: `${webhook.host}:${webhook.port}/api/tracking/${main}/${discordId}/${sub}`,
- options: {
- method, headers, body: method === 'POST' ? JSON.stringify(data) : undefined,
- },
- get: main,
- })
- } break
+ case 'gym-delete':
+ {
+ const [main, sub] = category.split('-')
+ Object.assign(payloadObj, {
+ url: `${webhook.host}:${webhook.port}/api/tracking/${main}/${discordId}/${sub}`,
+ options: {
+ method,
+ headers,
+ body: method === 'POST' ? JSON.stringify(data) : undefined,
+ },
+ get: main,
+ })
+ }
+ break
case 'egg':
case 'invasion':
case 'lure':
@@ -94,26 +128,48 @@ module.exports = async function webhookApi(category, discordId, method, webhookN
case 'raid':
case 'gym':
Object.assign(payloadObj, {
- url: `${webhook.host}:${webhook.port}/api/tracking/${category}/${discordId}${method === 'DELETE' ? `/byUid/${data.uid}` : ''}`,
+ url: `${webhook.host}:${
+ webhook.port
+ }/api/tracking/${category}/${discordId}${
+ method === 'DELETE' ? `/byUid/${data.uid}` : ''
+ }`,
options: {
- method, headers, body: method === 'POST' ? JSON.stringify(data) : undefined,
+ method,
+ headers,
+ body: method === 'POST' ? JSON.stringify(data) : undefined,
},
get: method === 'DELETE' ? undefined : category,
- }); break
- case 'quickGym': return resolveQuickHook(category, discordId, webhookName, data)
+ })
+ break
+ case 'quickGym':
+ return resolveQuickHook(category, discordId, webhookName, data)
default:
Object.assign(payloadObj, {
- url: `${webhook.host}:${webhook.port}/api/tracking/${category}/${discordId}${method === 'DELETE' ? `/byUid/${data.uid}` : ''}`,
+ url: `${webhook.host}:${
+ webhook.port
+ }/api/tracking/${category}/${discordId}${
+ method === 'DELETE' ? `/byUid/${data.uid}` : ''
+ }`,
options: {
- method, headers, body: data ? JSON.stringify(data) : null,
+ method,
+ headers,
+ body: data ? JSON.stringify(data) : null,
},
- }); break
+ })
+ break
}
if (payloadObj.options.body) {
- Object.assign(payloadObj.options.headers, { Accept: 'application/json', 'Content-Type': 'application/json' })
+ Object.assign(payloadObj.options.headers, {
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ })
}
- const post = await fetchJson(payloadObj.url, payloadObj.options, config.devOptions.enabled)
+ const post = await fetchJson(
+ payloadObj.url,
+ payloadObj.options,
+ config.devOptions.enabled,
+ )
if (!post) {
throw new Error('No data returned from server')
@@ -128,13 +184,20 @@ module.exports = async function webhookApi(category, discordId, method, webhookN
default:
return `${webhook.host}:${webhook.port}/api/tracking/${payloadObj.get}/${discordId}`
}
- }())
- const get = await fetchJson(getUrl, { method: 'GET', headers }, config.devOptions.enabled)
+ })()
+ const get = await fetchJson(
+ getUrl,
+ { method: 'GET', headers },
+ config.devOptions.enabled,
+ )
return { ...post, ...get }
}
return post
} catch (e) {
- console.log(e.message, 'There was a problem processing that webhook request')
+ console.log(
+ e.message,
+ 'There was a problem processing that webhook request',
+ )
return { status: 'error', message: 'webhook_error' }
}
}
diff --git a/server/src/services/areas.js b/server/src/services/areas.js
index 901bd47d4..b988c9a3b 100644
--- a/server/src/services/areas.js
+++ b/server/src/services/areas.js
@@ -4,15 +4,19 @@ const config = require('./config')
const loadAreas = () => {
try {
const normalized = { type: 'FeatureCollection', features: [] }
- Object.values(config.scanAreas).forEach(area => {
+ Object.values(config.scanAreas).forEach((area) => {
if (area?.features.length) {
normalized.features.push(...area.features)
}
})
return normalized
} catch (err) {
- if (config.authentication.areaRestrictions.some(rule => rule.roles.length)) {
- console.warn('[Area Restrictions] Disabled - `areas.json` file is missing or broken.')
+ if (
+ config.authentication.areaRestrictions.some((rule) => rule.roles.length)
+ ) {
+ console.warn(
+ '[Area Restrictions] Disabled - `areas.json` file is missing or broken.',
+ )
}
}
}
@@ -24,11 +28,11 @@ const parseAreas = (areasObj) => {
if (!areasObj) {
return { names, polygons }
}
- areasObj.features.forEach(feature => {
+ areasObj.features.forEach((feature) => {
const { name } = feature.properties
if (feature.geometry.type == 'Polygon' && name) {
polygons[name] = []
- feature.geometry.coordinates.forEach(coordPair => {
+ feature.geometry.coordinates.forEach((coordPair) => {
polygons[name].push(...coordPair)
})
names.push(name)
diff --git a/server/src/services/checkForUpdates.js b/server/src/services/checkForUpdates.js
index 081ec7e25..448190c57 100644
--- a/server/src/services/checkForUpdates.js
+++ b/server/src/services/checkForUpdates.js
@@ -8,7 +8,10 @@ let isDocker = false
try {
exec('git branch --show-current', (err, stdout) => {
try {
- const gitRef = fs.readFileSync(path.resolve(`${__dirname}/../../../.gitref`), 'utf8')
+ const gitRef = fs.readFileSync(
+ path.resolve(`${__dirname}/../../../.gitref`),
+ 'utf8',
+ )
if (!gitRef && (err || typeof stdout !== 'string' || !stdout.trim())) {
throw new Error(err)
@@ -16,41 +19,79 @@ try {
if (typeof gitRef === 'string' && gitRef.trim()) {
isDocker = true
}
- const branch = typeof gitRef === 'string' && gitRef.trim()
- ? gitRef.split('/')[2].trim()
- : stdout.trim()
+ const branch =
+ typeof gitRef === 'string' && gitRef.trim()
+ ? gitRef.split('/')[2].trim()
+ : stdout.trim()
exec('git rev-parse HEAD', (err2, stdout2) => {
try {
- const gitSha = fs.readFileSync(path.resolve(`${__dirname}/../../../.gitsha`), 'utf8')
+ const gitSha = fs.readFileSync(
+ path.resolve(`${__dirname}/../../../.gitsha`),
+ 'utf8',
+ )
- if (!gitSha && (err2 || typeof stdout2 !== 'string' || !stdout2.trim())) {
+ if (
+ !gitSha &&
+ (err2 || typeof stdout2 !== 'string' || !stdout2.trim())
+ ) {
throw new Error(err2)
}
- const sha = typeof gitSha === 'string' && gitSha.trim()
- ? gitSha.trim()
- : stdout2.trim()
+ const sha =
+ typeof gitSha === 'string' && gitSha.trim()
+ ? gitSha.trim()
+ : stdout2.trim()
- exec(`git ls-remote https://github.com/WatWowMap/ReactMap/ refs/heads/${branch}`, (err3, stdout3) => {
- try {
- if (err3 || typeof stdout3 !== 'string' || !stdout3?.split('\t')?.[0]) {
- throw new Error(err3)
- }
- const remoteSha = stdout3.split('\t')[0]
+ exec(
+ `git ls-remote https://github.com/WatWowMap/ReactMap/ refs/heads/${branch}`,
+ (err3, stdout3) => {
+ try {
+ if (
+ err3 ||
+ typeof stdout3 !== 'string' ||
+ !stdout3?.split('\t')?.[0]
+ ) {
+ throw new Error(err3)
+ }
+ const remoteSha = stdout3.split('\t')[0]
- if (remoteSha !== sha) {
- console.log('[UPDATE] There is a new version available: ', remoteSha, isDocker ? 'docker-compose pull' : 'git pull', ' to update')
+ if (remoteSha !== sha) {
+ console.log(
+ '[UPDATE] There is a new version available: ',
+ remoteSha,
+ isDocker ? 'docker-compose pull' : 'git pull',
+ ' to update',
+ )
+ }
+ } catch (e) {
+ console.log(
+ '[UPDATE] Unable to get remote SHA:',
+ e.message,
+ '\nBranch:',
+ branch,
+ 'Local SHA:',
+ sha,
+ '\nProceeding normally...',
+ )
}
- } catch (e) {
- console.log('[UPDATE] Unable to get remote SHA:', e.message, '\nBranch:', branch, 'Local SHA:', sha, '\nProceeding normally...')
- }
- })
+ },
+ )
} catch (e) {
- console.log('[UPDATE] Unable to get current SHA:', e.message, '\nBranch:', branch, '\nProceeding normally...')
+ console.log(
+ '[UPDATE] Unable to get current SHA:',
+ e.message,
+ '\nBranch:',
+ branch,
+ '\nProceeding normally...',
+ )
}
})
} catch (e) {
- console.log('[UPDATE] Unable to determine the local git branch:', e.message, '\nProceeding normally...')
+ console.log(
+ '[UPDATE] Unable to determine the local git branch:',
+ e.message,
+ '\nProceeding normally...',
+ )
}
})
} catch (e) {
diff --git a/server/src/services/config.js b/server/src/services/config.js
index 2808cf486..bd88fb8d3 100644
--- a/server/src/services/config.js
+++ b/server/src/services/config.js
@@ -14,12 +14,27 @@ const config = require('config')
if (!fs.existsSync(path.resolve(`${__dirname}/../configs/local.json`))) {
// add database env variables from .env or docker-compose
const {
- SCANNER_DB_HOST, SCANNER_DB_PORT, SCANNER_DB_NAME, SCANNER_DB_USERNAME, SCANNER_DB_PASSWORD,
- MANUAL_DB_HOST, MANUAL_DB_PORT, MANUAL_DB_NAME, MANUAL_DB_USERNAME, MANUAL_DB_PASSWORD,
- MAP_GENERAL_START_LAT, MAP_GENERAL_START_LON,
+ SCANNER_DB_HOST,
+ SCANNER_DB_PORT,
+ SCANNER_DB_NAME,
+ SCANNER_DB_USERNAME,
+ SCANNER_DB_PASSWORD,
+ MANUAL_DB_HOST,
+ MANUAL_DB_PORT,
+ MANUAL_DB_NAME,
+ MANUAL_DB_USERNAME,
+ MANUAL_DB_PASSWORD,
+ MAP_GENERAL_START_LAT,
+ MAP_GENERAL_START_LON,
} = process.env
- if (SCANNER_DB_HOST && SCANNER_DB_PORT && SCANNER_DB_NAME && SCANNER_DB_USERNAME && SCANNER_DB_PASSWORD) {
+ if (
+ SCANNER_DB_HOST &&
+ SCANNER_DB_PORT &&
+ SCANNER_DB_NAME &&
+ SCANNER_DB_USERNAME &&
+ SCANNER_DB_PASSWORD
+ ) {
config.database.schemas.push({
host: SCANNER_DB_HOST,
port: +SCANNER_DB_PORT,
@@ -37,47 +52,65 @@ if (!fs.existsSync(path.resolve(`${__dirname}/../configs/local.json`))) {
],
})
} else {
- throw new Error('Missing scanner database config! \nCheck to make sure you have SCANNER_DB_HOST,SCANNER_DB_PORT, SCANNER_DB_NAME, SCANNER_DB_USERNAME, and SCANNER_DB_PASSWORD')
+ throw new Error(
+ 'Missing scanner database config! \nCheck to make sure you have SCANNER_DB_HOST,SCANNER_DB_PORT, SCANNER_DB_NAME, SCANNER_DB_USERNAME, and SCANNER_DB_PASSWORD',
+ )
}
- if (MANUAL_DB_HOST && MANUAL_DB_PORT && MANUAL_DB_NAME && MANUAL_DB_USERNAME && MANUAL_DB_PASSWORD) {
+ if (
+ MANUAL_DB_HOST &&
+ MANUAL_DB_PORT &&
+ MANUAL_DB_NAME &&
+ MANUAL_DB_USERNAME &&
+ MANUAL_DB_PASSWORD
+ ) {
config.database.schemas.push({
host: MANUAL_DB_HOST,
port: +MANUAL_DB_PORT,
database: MANUAL_DB_NAME,
username: MANUAL_DB_USERNAME,
password: MANUAL_DB_PASSWORD,
- useFor: [
- 'session',
- 'user',
- 'nest',
- 'portal',
- ],
+ useFor: ['session', 'user', 'nest', 'portal'],
})
} else {
- throw new Error('Missing manual database config! \nCheck to make sure you have MANUAL_DB_HOST,MANUAL_DB_PORT, MANUAL_DB_NAME, MANUAL_DB_USERNAME, and MANUAL_DB_PASSWORD')
+ throw new Error(
+ 'Missing manual database config! \nCheck to make sure you have MANUAL_DB_HOST,MANUAL_DB_PORT, MANUAL_DB_NAME, MANUAL_DB_USERNAME, and MANUAL_DB_PASSWORD',
+ )
}
if (!MAP_GENERAL_START_LAT || !MAP_GENERAL_START_LON) {
- console.warn('Missing, MAP_GENERAL_START_LAT OR MAP_GENERAL_START_LON\nYou will be able to proceed but you should add these values to your docker-compose file')
+ console.warn(
+ 'Missing, MAP_GENERAL_START_LAT OR MAP_GENERAL_START_LON\nYou will be able to proceed but you should add these values to your docker-compose file',
+ )
}
}
if (fs.existsSync(path.resolve(`${__dirname}/../configs/config.json`))) {
- console.log('[CONFIG] Config v1 (config.json) found, it is fine to leave it but make sure you are using and updating local.json instead.')
+ console.log(
+ '[CONFIG] Config v1 (config.json) found, it is fine to leave it but make sure you are using and updating local.json instead.',
+ )
}
const mergeMapConfig = (obj) => {
if (process.env.TELEGRAM_BOT_NAME && !obj?.customRoutes?.telegramBotName) {
- if (obj.customRoutes) obj.customRoutes.telegramBotName = process.env.TELEGRAM_BOT_NAME
- console.warn('[CONFIG] TELEGRAM_BOT_NAME has been moved from the .env file to your config, telegramBotEnvRef is now deprecated.\nplease use customRoutes.telegramBotName instead\n(Move them from your .env file to your config file)')
+ if (obj.customRoutes)
+ obj.customRoutes.telegramBotName = process.env.TELEGRAM_BOT_NAME
+ console.warn(
+ '[CONFIG] TELEGRAM_BOT_NAME has been moved from the .env file to your config, telegramBotEnvRef is now deprecated.\nplease use customRoutes.telegramBotName instead\n(Move them from your .env file to your config file)',
+ )
}
if (obj?.customRoutes?.telegramBotEnvRef) {
- console.warn('[CONFIG] TELEGRAM_BOT_NAME has been moved from the .env file to your config, telegramBotEnvRef is now deprecated.\nplease use customRoutes.telegramBotName instead\n(Move them from your .env file to your config file)')
- obj.customRoutes.telegramBotName = process.env[obj.customRoutes.telegramBotEnvRef]
+ console.warn(
+ '[CONFIG] TELEGRAM_BOT_NAME has been moved from the .env file to your config, telegramBotEnvRef is now deprecated.\nplease use customRoutes.telegramBotName instead\n(Move them from your .env file to your config file)',
+ )
+ obj.customRoutes.telegramBotName =
+ process.env[obj.customRoutes.telegramBotEnvRef]
}
- ['messageOfTheDay', 'donationPage', 'loginPage'].forEach(category => {
+ ;['messageOfTheDay', 'donationPage', 'loginPage'].forEach((category) => {
if (obj?.[category]?.components) {
- obj[category].components.forEach(component => {
+ obj[category].components.forEach((component) => {
if (component.type === 'telegram' && component.telegramBotEnvRef) {
- console.warn('[CONFIG] telegramBotEnvRef is deprecated, please use telegramBotName instead\n', category)
+ console.warn(
+ '[CONFIG] telegramBotEnvRef is deprecated, please use telegramBotName instead\n',
+ category,
+ )
console.warn('OLD:\n', component)
component.telegramBotName = process.env[component.telegramBotEnvRef]
delete component.telegramBotEnvRef
@@ -107,50 +140,79 @@ config.map = mergeMapConfig(config.map)
// Create multiDomain Objects
config.multiDomainsObj = Object.fromEntries(
- config.multiDomains.map(d => [d.domain, mergeMapConfig(d)]),
+ config.multiDomains.map((d) => [d.domain, mergeMapConfig(d)]),
)
// Consolidate Auth Methods
// Create Authentication Objects
-config.authMethods = [...new Set(config.authentication.strategies
- .filter(strategy => strategy.enabled)
- .map(strategy => {
- config.authentication[strategy.name] = strategy
- return strategy.type
- })),
-];
+config.authMethods = [
+ ...new Set(
+ config.authentication.strategies
+ .filter((strategy) => strategy.enabled)
+ .map((strategy) => {
+ config.authentication[strategy.name] = strategy
+ return strategy.type
+ }),
+ ),
+]
// Check if empty
-['tileServers', 'navigation'].forEach(opt => {
- if (!config[opt].length) console.warn(`[${opt}] is empty, you need to add options to it or remove the empty array from your config.`)
+;['tileServers', 'navigation'].forEach((opt) => {
+ if (!config[opt].length) {
+ console.warn(
+ `[${opt}] is empty, you need to add options to it or remove the empty array from your config.`,
+ )
+ }
})
// Load each areas.json
-const loadScanPolygons = (fileName) => fs.existsSync(path.resolve(`${__dirname}/../configs/${fileName}`))
- ? require(`../configs/${fileName}`)
- : { features: [] }
+const loadScanPolygons = (fileName) =>
+ fs.existsSync(path.resolve(`${__dirname}/../configs/${fileName}`))
+ ? require(`../configs/${fileName}`)
+ : { features: [] }
// Check if an areas.json exists
config.scanAreas = {
main: loadScanPolygons(config.map.geoJsonFileName),
...Object.fromEntries(
- config.multiDomains.map(d => [d.general?.geoJsonFileName ? d.domain : 'main', loadScanPolygons(d.general?.geoJsonFileName || config.map.geoJsonFileName)]),
+ config.multiDomains.map((d) => [
+ d.general?.geoJsonFileName ? d.domain : 'main',
+ loadScanPolygons(
+ d.general?.geoJsonFileName || config.map.geoJsonFileName,
+ ),
+ ]),
),
}
-config.api.pvp.leagueObj = Object.fromEntries(config.api.pvp.leagues.map(league => [league.name, league.cp]))
-const hasLittle = config.api.pvp.leagues.find(league => league.name === 'little')
+config.api.pvp.leagueObj = Object.fromEntries(
+ config.api.pvp.leagues.map((league) => [league.name, league.cp]),
+)
+const hasLittle = config.api.pvp.leagues.find(
+ (league) => league.name === 'little',
+)
if (hasLittle) {
- config.api.pvp.leagueObj.little = hasLittle.littleCupRules ? 500 : { little: false, cap: 500 }
+ config.api.pvp.leagueObj.little = hasLittle.littleCupRules
+ ? 500
+ : { little: false, cap: 500 }
}
-if (!config.authentication.strategies.length || !config.authentication.strategies.find(strategy => strategy.enabled)) {
- const enabled = Object.keys(config.authentication.perms).filter(perm => config.authentication.perms[perm].enabled)
- console.warn('[CONFIG] No authentication strategies enabled, adding the following perms to alwaysEnabledPerms array:\n', enabled)
+if (
+ !config.authentication.strategies.length ||
+ !config.authentication.strategies.find((strategy) => strategy.enabled)
+) {
+ const enabled = Object.keys(config.authentication.perms).filter(
+ (perm) => config.authentication.perms[perm].enabled,
+ )
+ console.warn(
+ '[CONFIG] No authentication strategies enabled, adding the following perms to alwaysEnabledPerms array:\n',
+ enabled,
+ )
config.authentication.alwaysEnabledPerms = enabled
}
// Map manual areas
-config.manualAreas = Object.fromEntries(config.manualAreas.map(area => [area.name, area]))
+config.manualAreas = Object.fromEntries(
+ config.manualAreas.map((area) => [area.name, area]),
+)
module.exports = config
diff --git a/server/src/services/defaultFilters/buildDefaultFilters.js b/server/src/services/defaultFilters/buildDefaultFilters.js
index 03d4d256d..b8684c20c 100644
--- a/server/src/services/defaultFilters/buildDefaultFilters.js
+++ b/server/src/services/defaultFilters/buildDefaultFilters.js
@@ -8,102 +8,138 @@ const buildGyms = require('./buildGyms')
const { GenericFilter, PokemonFilter } = require('../../models/index')
const base = new PokemonFilter(defaultFilters.pokemon.allPokemon)
-const custom = new PokemonFilter(defaultFilters.pokemon.allPokemon, 'md', ...Object.values(defaultFilters.pokemon.globalValues))
+const custom = new PokemonFilter(
+ defaultFilters.pokemon.allPokemon,
+ 'md',
+ ...Object.values(defaultFilters.pokemon.globalValues),
+)
module.exports = function buildDefault(perms, available) {
- const stopReducer = perms.pokestops || perms.lures || perms.quests || perms.invasions
+ const stopReducer =
+ perms.pokestops || perms.lures || perms.quests || perms.invasions
const gymReducer = perms.gyms || perms.raids
const pokemonReducer = perms.iv || perms.pvp
const pokemon = buildPokemon(defaultFilters, base, custom, available)
return {
- gyms: gymReducer ? {
- enabled: defaultFilters.gyms.enabled,
- allGyms: perms.gyms ? defaultFilters.gyms.enabled : undefined,
- raids: perms.raids ? defaultFilters.gyms.raids : undefined,
- exEligible: perms.gyms ? defaultFilters.gyms.exEligible : undefined,
- inBattle: perms.gyms ? defaultFilters.gyms.exEligible : undefined,
- arEligible: perms.gyms ? false : undefined,
- gymBadges: perms.gymBadges ? defaultFilters.gyms.gymBadges : undefined,
- badge: perms.gymBadges ? 'all' : undefined,
- raidTier: perms.raids ? 'all' : undefined,
- filter: {
- ...buildGyms(perms, defaultFilters.gyms, available),
- ...pokemon.raids,
- },
- } : undefined,
- nests: perms.nests ? {
- enabled: defaultFilters.nests.enabled,
- pokemon: defaultFilters.nests.pokemon,
- polygons: defaultFilters.nests.polygons,
- avgFilter: defaultFilters.nests.avgFilter,
- filter: pokemon.nests,
- } : undefined,
- pokestops: stopReducer ? {
- enabled: defaultFilters.pokestops.enabled,
- allPokestops: perms.pokestops ? defaultFilters.pokestops.enabled : undefined,
- lures: perms.lures ? defaultFilters.pokestops.lures : undefined,
- quests: perms.quests ? defaultFilters.pokestops.quests : undefined,
- showQuestSet: defaultFilters.pokestops.questSet,
- invasions: perms.invasions ? defaultFilters.pokestops.invasions : undefined,
- arEligible: perms.pokestops ? false : undefined,
- filter: {
- ...buildPokestops(perms, defaultFilters.pokestops, available),
- ...pokemon.quests,
- },
- } : undefined,
- pokemon: perms.pokemon ? {
- enabled: defaultFilters.pokemon.enabled,
- legacy: (pokemonReducer && enableMapJsFilter) ? defaultFilters.pokemon.legacyFilter : undefined,
- iv: perms.iv ? true : undefined,
- pvp: perms.pvp ? true : undefined,
- standard: base,
- ivOr: custom,
- xsRat: false,
- xlKarp: false,
- zeroIv: perms.iv ? false : undefined,
- hundoIv: perms.iv ? true : undefined,
- filter: pokemon.full,
- } : undefined,
- portals: perms.portals ? {
- enabled: defaultFilters.portals.enabled,
- filter: {
- global: new GenericFilter(),
- old: new GenericFilter(),
- new: new GenericFilter(),
- },
- } : undefined,
- scanAreas: perms.scanAreas ? {
- enabled: defaultFilters.scanAreas.enabled,
- filter: {},
- } : undefined,
- submissionCells: perms.submissionCells ? {
- enabled: defaultFilters.submissionCells.enabled,
- filter: { global: new GenericFilter() },
- } : undefined,
- weather: perms.weather ? {
- enabled: defaultFilters.weather.enabled,
- filter: { global: new GenericFilter() },
- } : undefined,
- spawnpoints: perms.spawnpoints ? {
- enabled: defaultFilters.spawnpoints.enabled,
- filter: {
- global: new GenericFilter(),
- confirmed: new GenericFilter(),
- unconfirmed: new GenericFilter(),
- },
- } : undefined,
- scanCells: perms.scanCells ? {
- enabled: defaultFilters.scanCells.enabled,
- filter: { global: new GenericFilter() },
- } : undefined,
- devices: perms.devices ? {
- enabled: defaultFilters.devices.enabled,
- filter: {
- online: new GenericFilter(),
- offline: new GenericFilter(),
- global: new GenericFilter(),
- },
- } : undefined,
+ gyms: gymReducer
+ ? {
+ enabled: defaultFilters.gyms.enabled,
+ allGyms: perms.gyms ? defaultFilters.gyms.enabled : undefined,
+ raids: perms.raids ? defaultFilters.gyms.raids : undefined,
+ exEligible: perms.gyms ? defaultFilters.gyms.exEligible : undefined,
+ inBattle: perms.gyms ? defaultFilters.gyms.exEligible : undefined,
+ arEligible: perms.gyms ? false : undefined,
+ gymBadges: perms.gymBadges
+ ? defaultFilters.gyms.gymBadges
+ : undefined,
+ badge: perms.gymBadges ? 'all' : undefined,
+ raidTier: perms.raids ? 'all' : undefined,
+ filter: {
+ ...buildGyms(perms, defaultFilters.gyms, available),
+ ...pokemon.raids,
+ },
+ }
+ : undefined,
+ nests: perms.nests
+ ? {
+ enabled: defaultFilters.nests.enabled,
+ pokemon: defaultFilters.nests.pokemon,
+ polygons: defaultFilters.nests.polygons,
+ avgFilter: defaultFilters.nests.avgFilter,
+ filter: pokemon.nests,
+ }
+ : undefined,
+ pokestops: stopReducer
+ ? {
+ enabled: defaultFilters.pokestops.enabled,
+ allPokestops: perms.pokestops
+ ? defaultFilters.pokestops.enabled
+ : undefined,
+ lures: perms.lures ? defaultFilters.pokestops.lures : undefined,
+ quests: perms.quests ? defaultFilters.pokestops.quests : undefined,
+ showQuestSet: defaultFilters.pokestops.questSet,
+ invasions: perms.invasions
+ ? defaultFilters.pokestops.invasions
+ : undefined,
+ arEligible: perms.pokestops ? false : undefined,
+ filter: {
+ ...buildPokestops(perms, defaultFilters.pokestops, available),
+ ...pokemon.quests,
+ },
+ }
+ : undefined,
+ pokemon: perms.pokemon
+ ? {
+ enabled: defaultFilters.pokemon.enabled,
+ legacy:
+ pokemonReducer && enableMapJsFilter
+ ? defaultFilters.pokemon.legacyFilter
+ : undefined,
+ iv: perms.iv ? true : undefined,
+ pvp: perms.pvp ? true : undefined,
+ standard: base,
+ ivOr: custom,
+ xsRat: false,
+ xlKarp: false,
+ zeroIv: perms.iv ? false : undefined,
+ hundoIv: perms.iv ? true : undefined,
+ filter: pokemon.full,
+ }
+ : undefined,
+ portals: perms.portals
+ ? {
+ enabled: defaultFilters.portals.enabled,
+ filter: {
+ global: new GenericFilter(),
+ old: new GenericFilter(),
+ new: new GenericFilter(),
+ },
+ }
+ : undefined,
+ scanAreas: perms.scanAreas
+ ? {
+ enabled: defaultFilters.scanAreas.enabled,
+ filter: {},
+ }
+ : undefined,
+ submissionCells: perms.submissionCells
+ ? {
+ enabled: defaultFilters.submissionCells.enabled,
+ filter: { global: new GenericFilter() },
+ }
+ : undefined,
+ weather: perms.weather
+ ? {
+ enabled: defaultFilters.weather.enabled,
+ filter: { global: new GenericFilter() },
+ }
+ : undefined,
+ spawnpoints: perms.spawnpoints
+ ? {
+ enabled: defaultFilters.spawnpoints.enabled,
+ filter: {
+ global: new GenericFilter(),
+ confirmed: new GenericFilter(),
+ unconfirmed: new GenericFilter(),
+ },
+ }
+ : undefined,
+ scanCells: perms.scanCells
+ ? {
+ enabled: defaultFilters.scanCells.enabled,
+ filter: { global: new GenericFilter() },
+ }
+ : undefined,
+ devices: perms.devices
+ ? {
+ enabled: defaultFilters.devices.enabled,
+ filter: {
+ online: new GenericFilter(),
+ offline: new GenericFilter(),
+ global: new GenericFilter(),
+ },
+ }
+ : undefined,
}
}
diff --git a/server/src/services/defaultFilters/buildGyms.js b/server/src/services/defaultFilters/buildGyms.js
index abf8b9455..a4535acd5 100644
--- a/server/src/services/defaultFilters/buildGyms.js
+++ b/server/src/services/defaultFilters/buildGyms.js
@@ -7,19 +7,19 @@ module.exports = function buildGyms(perms, defaults, available) {
defaults.baseTeamIds.forEach((team, i) => {
gymFilters[`t${team}-0`] = new GenericFilter(defaults.allGyms)
if (i) {
- defaults.baseGymSlotAmounts.forEach(slot => {
+ defaults.baseGymSlotAmounts.forEach((slot) => {
gymFilters[`g${team}-${slot}`] = new GenericFilter(defaults.allGyms)
})
}
})
}
if (perms.raids) {
- defaults.baseRaidTiers.forEach(tier => {
+ defaults.baseRaidTiers.forEach((tier) => {
gymFilters[`e${tier}`] = new GenericFilter(defaults.eggs)
gymFilters[`r${tier}`] = new GenericFilter(defaults.raids)
})
}
- available.gyms.forEach(avail => {
+ available.gyms.forEach((avail) => {
if (perms.gyms && (avail.startsWith('t') || avail.startsWith('g'))) {
gymFilters[avail] = new GenericFilter(defaults.allGyms)
}
diff --git a/server/src/services/defaultFilters/buildPokemon.js b/server/src/services/defaultFilters/buildPokemon.js
index 98fea8c80..2650bf6a3 100644
--- a/server/src/services/defaultFilters/buildPokemon.js
+++ b/server/src/services/defaultFilters/buildPokemon.js
@@ -9,24 +9,35 @@ module.exports = function buildPokemon(defaults, base, custom, available) {
quests: { global: new GenericFilter() },
nests: { global: new GenericFilter() },
}
- const energyAmounts = new Set([...defaults.pokestops.baseMegaEnergyAmounts, ...available.pokestops
- .filter((e) => e.startsWith('m'))
- .map((e) => e.split('-')[1])])
+ const energyAmounts = new Set([
+ ...defaults.pokestops.baseMegaEnergyAmounts,
+ ...available.pokestops
+ .filter((e) => e.startsWith('m'))
+ .map((e) => e.split('-')[1]),
+ ])
for (const [i, pkmn] of Object.entries(Event.masterfile.pokemon)) {
for (const j of Object.keys(pkmn.forms)) {
pokemon.full[`${i}-${j}`] = base
pokemon.raids[`${i}-${j}`] = new GenericFilter(defaults.gyms.pokemon)
- pokemon.quests[`${i}-${j}`] = new GenericFilter(defaults.pokestops.pokemon)
+ pokemon.quests[`${i}-${j}`] = new GenericFilter(
+ defaults.pokestops.pokemon,
+ )
pokemon.nests[`${i}-${j}`] = new GenericFilter(defaults.nests.allPokemon)
}
if (pkmn.family == i) {
- pokemon.quests[`c${pkmn.family}`] = new GenericFilter(defaults.pokestops.candy)
- pokemon.quests[`x${pkmn.family}`] = new GenericFilter(defaults.pokestops.candy)
+ pokemon.quests[`c${pkmn.family}`] = new GenericFilter(
+ defaults.pokestops.candy,
+ )
+ pokemon.quests[`x${pkmn.family}`] = new GenericFilter(
+ defaults.pokestops.candy,
+ )
}
if (pkmn.tempEvolutions) {
energyAmounts.forEach((a) => {
- pokemon.quests[`m${i}-${a}`] = new GenericFilter(defaults.pokestops.megaEnergy)
+ pokemon.quests[`m${i}-${a}`] = new GenericFilter(
+ defaults.pokestops.megaEnergy,
+ )
})
}
}
diff --git a/server/src/services/defaultFilters/buildPokestops.js b/server/src/services/defaultFilters/buildPokestops.js
index a22fdc8f4..d5731bf37 100644
--- a/server/src/services/defaultFilters/buildPokestops.js
+++ b/server/src/services/defaultFilters/buildPokestops.js
@@ -4,31 +4,35 @@ const { Event } = require('../initialization')
module.exports = function buildPokestops(perms, defaults, available) {
const quests = { s0: new GenericFilter() }
if (perms.lures) {
- defaults.baseLureIds.forEach(lure => {
+ defaults.baseLureIds.forEach((lure) => {
quests[`l${lure}`] = new GenericFilter(defaults.lures)
})
}
if (perms.quests) {
- Object.keys(Event.masterfile.items).forEach(item => {
+ Object.keys(Event.masterfile.items).forEach((item) => {
quests[`q${item}`] = new GenericFilter(defaults.items)
})
- for (let i = defaults.stardust.min; i <= defaults.stardust.max; i += defaults.stardust.interval) {
+ for (
+ let i = defaults.stardust.min;
+ i <= defaults.stardust.max;
+ i += defaults.stardust.interval
+ ) {
quests[`d${i}`] = new GenericFilter(defaults.stardust.enabled)
}
- Object.keys(Event.masterfile.questRewardTypes).forEach(type => {
+ Object.keys(Event.masterfile.questRewardTypes).forEach((type) => {
if (type !== '0') {
quests[`u${type}`] = new GenericFilter(defaults.rewardTypes)
}
})
}
if (perms.invasions) {
- Object.keys(Event.invasions).forEach(type => {
+ Object.keys(Event.invasions).forEach((type) => {
if (type !== '0') {
quests[`i${type}`] = new GenericFilter(defaults.allInvasions)
}
})
}
- available.pokestops.forEach(avail => {
+ available.pokestops.forEach((avail) => {
if (perms.lures && avail.startsWith('l')) {
quests[avail] = new GenericFilter(defaults.lures)
}
diff --git a/server/src/services/events/guildMemberUpdate.js b/server/src/services/events/guildMemberUpdate.js
index 5d393691b..fc9c2e633 100644
--- a/server/src/services/events/guildMemberUpdate.js
+++ b/server/src/services/events/guildMemberUpdate.js
@@ -5,26 +5,33 @@ const { User } = require('../../models/index')
module.exports = async (client, oldPresence, newPresence) => {
const rolesBefore = oldPresence.roles.cache
- .filter(x => BigInt(x.id).toString())
+ .filter((x) => BigInt(x.id).toString())
.keyArray()
const rolesAfter = newPresence.roles.cache
- .filter(x => BigInt(x.id).toString())
+ .filter((x) => BigInt(x.id).toString())
.keyArray()
- const perms = [...new Set(
- Object.values(client.config.perms)
- .map(x => x.roles)
- .flat(),
- )]
+ const perms = [
+ ...new Set(
+ Object.values(client.config.perms)
+ .map((x) => x.roles)
+ .flat(),
+ ),
+ ]
const roleDiff = rolesBefore
- .filter(x => !rolesAfter.includes(x))
- .concat(rolesAfter
- .filter(x => !rolesBefore.includes(x)))
+ .filter((x) => !rolesAfter.includes(x))
+ .concat(rolesAfter.filter((x) => !rolesBefore.includes(x)))
try {
if (perms.includes(roleDiff[0])) {
await clearDiscordSessions(oldPresence.user.id, client.user.username)
- await User.clearPerms(oldPresence.user.id, 'discord', client.user.username)
+ await User.clearPerms(
+ oldPresence.user.id,
+ 'discord',
+ client.user.username,
+ )
}
} catch (e) {
- console.error(`Could not clear sessions for ${oldPresence.user.username}#${oldPresence.user.discriminator}`)
+ console.error(
+ `Could not clear sessions for ${oldPresence.user.username}#${oldPresence.user.discriminator}`,
+ )
}
}
diff --git a/server/src/services/functions/areaPerms.js b/server/src/services/functions/areaPerms.js
index 3dd2cfad3..fd93d6cce 100644
--- a/server/src/services/functions/areaPerms.js
+++ b/server/src/services/functions/areaPerms.js
@@ -4,11 +4,11 @@ const config = require('../config')
module.exports = function areaPerms(roles) {
let perms = []
if (areas.names.length) {
- roles.forEach(group => {
- config.authentication.areaRestrictions.forEach(rule => {
+ roles.forEach((group) => {
+ config.authentication.areaRestrictions.forEach((rule) => {
if (rule.roles.includes(group)) {
if (rule.areas.length) {
- rule.areas.forEach(areaName => {
+ rule.areas.forEach((areaName) => {
if (areas.names.includes(areaName)) {
perms.push(areaName)
}
diff --git a/server/src/services/functions/dbSelection.js b/server/src/services/functions/dbSelection.js
index bd9106f6a..3d8e8d4f3 100644
--- a/server/src/services/functions/dbSelection.js
+++ b/server/src/services/functions/dbSelection.js
@@ -1,7 +1,10 @@
-const { database: { schemas } } = require('../config')
+const {
+ database: { schemas },
+} = require('../config')
module.exports = function dbSelection(category) {
- if (category === 'quest' || category === 'invasion' || category === 'lure') category = 'pokestop'
+ if (category === 'quest' || category === 'invasion' || category === 'lure')
+ category = 'pokestop'
if (category === 'raid') category = 'gym'
return schemas.find(({ useFor }) => useFor.includes(category))
}
diff --git a/server/src/services/functions/evalWebhookId.js b/server/src/services/functions/evalWebhookId.js
index 620ab6359..ab3540afe 100644
--- a/server/src/services/functions/evalWebhookId.js
+++ b/server/src/services/functions/evalWebhookId.js
@@ -4,8 +4,11 @@ module.exports = function evalWebhookId(user) {
}
const { strategy, webhookStrategy, discordId, telegramId } = user
switch (strategy) {
- case 'discord': return discordId
- case 'telegram': return telegramId
- default: return webhookStrategy === 'discord' ? discordId : telegramId
+ case 'discord':
+ return discordId
+ case 'telegram':
+ return telegramId
+ default:
+ return webhookStrategy === 'discord' ? discordId : telegramId
}
}
diff --git a/server/src/services/functions/getAreaSql.js b/server/src/services/functions/getAreaSql.js
index da20db5a3..35b36d89c 100644
--- a/server/src/services/functions/getAreaSql.js
+++ b/server/src/services/functions/getAreaSql.js
@@ -1,6 +1,11 @@
const areas = require('../areas')
-module.exports = function getAreaRestrictionSql(query, areaRestrictions, isMad, category) {
+module.exports = function getAreaRestrictionSql(
+ query,
+ areaRestrictions,
+ isMad,
+ category,
+) {
let columns = ['lat', 'lon']
if (isMad) {
if (category === 'device') {
@@ -9,19 +14,21 @@ module.exports = function getAreaRestrictionSql(query, areaRestrictions, isMad,
columns = ['latitude', 'longitude']
}
if (category === 'pokemon') {
- columns = columns.map(each => `pokemon.${each}`)
+ columns = columns.map((each) => `pokemon.${each}`)
}
} else if (category === 'device') {
- columns = columns.map(each => `last_${each}`)
+ columns = columns.map((each) => `last_${each}`)
}
if (category === 's2cell') {
- columns = columns.map(each => `center_${each}`)
+ columns = columns.map((each) => `center_${each}`)
}
- query.andWhere(restrictions => {
- areaRestrictions.forEach(area => {
- const polygon = areas.polygons[area].map(e => e.join(' ')).join()
- restrictions.orWhereRaw(`ST_CONTAINS(ST_GeomFromText("POLYGON((${polygon}))"), POINT(${columns[1]}, ${columns[0]}))`)
+ query.andWhere((restrictions) => {
+ areaRestrictions.forEach((area) => {
+ const polygon = areas.polygons[area].map((e) => e.join(' ')).join()
+ restrictions.orWhereRaw(
+ `ST_CONTAINS(ST_GeomFromText("POLYGON((${polygon}))"), POINT(${columns[1]}, ${columns[0]}))`,
+ )
})
})
}
diff --git a/server/src/services/functions/getPlacementCells.js b/server/src/services/functions/getPlacementCells.js
index d5744f7bc..4030dc29f 100644
--- a/server/src/services/functions/getPlacementCells.js
+++ b/server/src/services/functions/getPlacementCells.js
@@ -1,14 +1,19 @@
/* global BigInt */
const {
- S2LatLng, S2RegionCoverer, S2CellId, S2LatLngRect,
+ S2LatLng,
+ S2RegionCoverer,
+ S2CellId,
+ S2LatLngRect,
} = require('nodes2ts')
const getPolyVector = require('./getPolyVector')
const { Ring } = require('../../models/index')
module.exports = function getPlacementCells(bounds, pokestops, gyms) {
// dedupe poi entries
- const allCoords = Object.values(Object.fromEntries([...pokestops, ...gyms].map(poi => [poi.id, poi])))
+ const allCoords = Object.values(
+ Object.fromEntries([...pokestops, ...gyms].map((poi) => [poi.id, poi])),
+ )
const regionCoverer = new S2RegionCoverer()
regionCoverer.minLevel = 17
@@ -32,14 +37,16 @@ module.exports = function getPlacementCells(bounds, pokestops, gyms) {
}
for (let i = 0; i < allCoords.length; i += 1) {
const coords = allCoords[i]
- const level17Cell = S2CellId.fromPoint(S2LatLng.fromDegrees(coords.lat, coords.lon).toPoint()).parentL(17)
+ const level17Cell = S2CellId.fromPoint(
+ S2LatLng.fromDegrees(coords.lat, coords.lon).toPoint(),
+ ).parentL(17)
const cellId = BigInt(level17Cell.id).toString()
const cell = indexedCells[cellId]
if (cell) {
cell.blocked = true
}
}
- const rings = allCoords.map(poi => new Ring(poi.id, poi.lat, poi.lon))
+ const rings = allCoords.map((poi) => new Ring(poi.id, poi.lat, poi.lon))
return {
cells: Object.values(indexedCells),
diff --git a/server/src/services/functions/getPolyVector.js b/server/src/services/functions/getPolyVector.js
index f11352151..195a01077 100644
--- a/server/src/services/functions/getPolyVector.js
+++ b/server/src/services/functions/getPolyVector.js
@@ -1,7 +1,5 @@
/* global BigInt */
-const {
- S2LatLng, S2Cell, S2CellId, S2Point,
-} = require('nodes2ts')
+const { S2LatLng, S2Cell, S2CellId, S2Point } = require('nodes2ts')
module.exports = function getPolyVector(s2cellId, polyline) {
const s2cell = new S2Cell(new S2CellId(BigInt(s2cellId).toString()))
@@ -10,10 +8,7 @@ module.exports = function getPolyVector(s2cellId, polyline) {
const coordinate = s2cell.getVertex(i)
const point = new S2Point(coordinate.x, coordinate.y, coordinate.z)
const latLng = S2LatLng.fromPoint(point)
- polygon.push([
- latLng.latDegrees,
- latLng.lngDegrees,
- ])
+ polygon.push([latLng.latDegrees, latLng.lngDegrees])
}
if (polyline) {
polygon.push(polygon[0])
diff --git a/server/src/services/functions/getTypeCells.js b/server/src/services/functions/getTypeCells.js
index e4ddcbdfc..9fd34c32b 100644
--- a/server/src/services/functions/getTypeCells.js
+++ b/server/src/services/functions/getTypeCells.js
@@ -1,6 +1,9 @@
/* global BigInt */
const {
- S2LatLng, S2RegionCoverer, S2CellId, S2LatLngRect,
+ S2LatLng,
+ S2RegionCoverer,
+ S2CellId,
+ S2LatLngRect,
} = require('nodes2ts')
const getPolyVector = require('./getPolyVector')
@@ -29,7 +32,9 @@ module.exports = function getTypeCells(bounds, pokestops, gyms) {
}
for (let i = 0; i < gyms.length; i += 1) {
const coords = gyms[i]
- const level14Cell = S2CellId.fromPoint(S2LatLng.fromDegrees(coords.lat, coords.lon).toPoint()).parentL(14)
+ const level14Cell = S2CellId.fromPoint(
+ S2LatLng.fromDegrees(coords.lat, coords.lon).toPoint(),
+ ).parentL(14)
const cellId = BigInt(level14Cell.id).toString()
const cell = indexedCells[cellId]
if (cell) {
@@ -39,7 +44,9 @@ module.exports = function getTypeCells(bounds, pokestops, gyms) {
}
for (let i = 0; i < pokestops.length; i += 1) {
const coords = pokestops[i]
- const level14Cell = S2CellId.fromPoint(S2LatLng.fromDegrees(coords.lat, coords.lon).toPoint()).parentL(14)
+ const level14Cell = S2CellId.fromPoint(
+ S2LatLng.fromDegrees(coords.lat, coords.lon).toPoint(),
+ ).parentL(14)
const cellId = BigInt(level14Cell.id).toString()
const cell = indexedCells[cellId]
if (cell) {
diff --git a/server/src/services/functions/mergePerms.js b/server/src/services/functions/mergePerms.js
index 516709436..ced53a368 100644
--- a/server/src/services/functions/mergePerms.js
+++ b/server/src/services/functions/mergePerms.js
@@ -1,7 +1,10 @@
module.exports = function mergePerms(existingPerms, incomingPerms) {
return Object.fromEntries(
- Object.keys(existingPerms).map(key => [key, Array.isArray(existingPerms[key])
- ? [...new Set([...existingPerms[key], ...incomingPerms[key]])]
- : existingPerms[key] || incomingPerms[key]]),
+ Object.keys(existingPerms).map((key) => [
+ key,
+ Array.isArray(existingPerms[key])
+ ? [...new Set([...existingPerms[key], ...incomingPerms[key]])]
+ : existingPerms[key] || incomingPerms[key],
+ ]),
)
}
diff --git a/server/src/services/functions/permissions.js b/server/src/services/functions/permissions.js
index d93cdfcdf..78e876b8e 100644
--- a/server/src/services/functions/permissions.js
+++ b/server/src/services/functions/permissions.js
@@ -3,42 +3,57 @@ module.exports = function permissionManager(permToCheck, perms) {
permToCheck = permToCheck.replace('quick', '').toLowerCase()
}
switch (permToCheck) {
- case 'map': return perms.map
+ case 'map':
+ return perms.map
case 'team':
case 'teams':
case 'gym':
- case 'gyms': return perms.gyms
+ case 'gyms':
+ return perms.gyms
case 'egg':
case 'eggs':
case 'raid':
- case 'raids': return perms.raids
+ case 'raids':
+ return perms.raids
case 'monster':
case 'monsters':
case 'pokemon':
- case 'pokemons': return perms.pokemon
+ case 'pokemons':
+ return perms.pokemon
case 'iv':
- case 'ivs': return perms.iv
+ case 'ivs':
+ return perms.iv
case 'pvp':
- case 'pvps': return perms.pvp
+ case 'pvps':
+ return perms.pvp
case 'nest':
- case 'nests': return perms.nests
+ case 'nests':
+ return perms.nests
case 'pokestop':
- case 'pokestops': return perms.pokestops
+ case 'pokestops':
+ return perms.pokestops
case 'quest':
- case 'quests': return perms.quests
+ case 'quests':
+ return perms.quests
case 'lure':
- case 'lures': return perms.lures
+ case 'lures':
+ return perms.lures
case 'invasion':
- case 'invasions': return perms.invasions
+ case 'invasions':
+ return perms.invasions
case 'scanArea':
- case 'scanAreas': return perms.scanAreas
+ case 'scanAreas':
+ return perms.scanAreas
case 'spawnpoint':
- case 'spawnpoints': return perms.spawnpoints
+ case 'spawnpoints':
+ return perms.spawnpoints
case 'webhook':
case 'setLocation':
case 'setAreas':
case 'switchProfile':
- case 'webhooks': return perms.webhooks
- default: return false
+ case 'webhooks':
+ return perms.webhooks
+ default:
+ return false
}
}
diff --git a/server/src/services/functions/scannerPerms.js b/server/src/services/functions/scannerPerms.js
index 212f9bb3a..39c8ffb38 100644
--- a/server/src/services/functions/scannerPerms.js
+++ b/server/src/services/functions/scannerPerms.js
@@ -3,8 +3,8 @@ const { scanner } = require('../config')
module.exports = function scannerPerms(roles, provider) {
let perms = []
if (Object.keys(scanner).length) {
- roles.forEach(role => {
- Object.keys(scanner).forEach(mode => {
+ roles.forEach((role) => {
+ Object.keys(scanner).forEach((mode) => {
if (scanner[mode][provider]?.includes(role)) {
perms.push(mode)
}
diff --git a/server/src/services/functions/webhookPerms.js b/server/src/services/functions/webhookPerms.js
index f691958b7..3f6574594 100644
--- a/server/src/services/functions/webhookPerms.js
+++ b/server/src/services/functions/webhookPerms.js
@@ -3,8 +3,8 @@ const { webhooks } = require('../config')
module.exports = function webhookPerms(roles, provider) {
let perms = []
if (webhooks.length) {
- roles.forEach(role => {
- webhooks.forEach(webhook => {
+ roles.forEach((role) => {
+ webhooks.forEach((webhook) => {
if (webhook?.[provider]?.includes(role)) {
perms.push(webhook.name)
}
diff --git a/server/src/services/geocoder.js b/server/src/services/geocoder.js
index 592e82c2d..de3bda289 100644
--- a/server/src/services/geocoder.js
+++ b/server/src/services/geocoder.js
@@ -17,7 +17,9 @@ module.exports = async function geocoder(nominatimUrl, search, reverse) {
town: result.address.town || '',
village: result.address.village || '',
}))(stockGeocoder._geocoder._formatResult)
- const results = reverse ? await stockGeocoder.reverse(search) : await stockGeocoder.geocode(search)
+ const results = reverse
+ ? await stockGeocoder.reverse(search)
+ : await stockGeocoder.geocode(search)
return reverse ? results[0] : results
} catch (e) {
console.warn('[GEOCODER] Unable to geocode', search)
diff --git a/server/src/services/initWebhooks.js b/server/src/services/initWebhooks.js
index 2702ba5fc..69e4714fd 100644
--- a/server/src/services/initWebhooks.js
+++ b/server/src/services/initWebhooks.js
@@ -8,21 +8,39 @@ module.exports = async function initWebhooks(webhook, config) {
throw new Error('Webhook name property is required and must be unique')
}
if (webhook.enabled) {
- const options = { method: 'GET', headers: { 'X-Poracle-Secret': webhook.poracleSecret } }
- webhook.areasToSkip = webhook.areasToSkip?.map(x => x.toLowerCase()) || []
+ const options = {
+ method: 'GET',
+ headers: { 'X-Poracle-Secret': webhook.poracleSecret },
+ }
+ webhook.areasToSkip =
+ webhook.areasToSkip?.map((x) => x.toLowerCase()) || []
- const hookConfig = await fetchJson(`${webhook.host}:${webhook.port}/api/config/poracleWeb`, options, config.devOptions.enabled)
+ const hookConfig = await fetchJson(
+ `${webhook.host}:${webhook.port}/api/config/poracleWeb`,
+ options,
+ config.devOptions.enabled,
+ )
if (!hookConfig) {
throw new Error(`Webhook [${webhook.name}] is not configured correctly`)
}
if (!hookConfig.version) {
- throw new Error(`No version found, webhook [${webhook.name}] is not configured correctly`)
+ throw new Error(
+ `No version found, webhook [${webhook.name}] is not configured correctly`,
+ )
}
- const [major, minor, patch] = hookConfig.version.split('.').map(x => parseInt(x))
+ const [major, minor, patch] = hookConfig.version
+ .split('.')
+ .map((x) => parseInt(x))
- if (major < 4 || (major === 4 && minor < 5) || (major === 4 && minor === 5 && patch < 1)) {
- throw new Error(`Poracle must be at least version 4.5.1, current version is ${hookConfig.version}`)
+ if (
+ major < 4 ||
+ (major === 4 && minor < 5) ||
+ (major === 4 && minor === 5 && patch < 1)
+ ) {
+ throw new Error(
+ `Poracle must be at least version 4.5.1, current version is ${hookConfig.version}`,
+ )
}
const baseSettings = {
@@ -30,29 +48,46 @@ module.exports = async function initWebhooks(webhook, config) {
platform: webhook.platform,
addressFormat: webhook.addressFormat || hookConfig.addressFormat,
fetched: Date.now(),
- leagues: [{ name: 'great', cp: 1500, min: hookConfig.pvpFilterGreatMinCP }, { name: 'ultra', cp: 2500, min: hookConfig.pvpFilterUltraMinCP }],
+ leagues: [
+ { name: 'great', cp: 1500, min: hookConfig.pvpFilterGreatMinCP },
+ { name: 'ultra', cp: 2500, min: hookConfig.pvpFilterUltraMinCP },
+ ],
valid: Boolean(hookConfig),
pvp: 'rdm',
everything: hookConfig.everythingFlagPermissions === 'allow-any',
gymBattles: hookConfig.gymBattles,
}
if (hookConfig?.pvpLittleLeagueAllowed) {
- baseSettings.leagues.push({ name: 'little', cp: 500, min: hookConfig.pvpFilterLittleMinCP })
+ baseSettings.leagues.push({
+ name: 'little',
+ cp: 500,
+ min: hookConfig.pvpFilterLittleMinCP,
+ })
baseSettings.pvp = 'ohbem'
}
- const templates = await fetchJson(`${webhook.host}:${webhook.port}/api/config/templates?names=true`, options, config.devOptions.enabled)
- const areas = await fetchJson(`${webhook.host}:${webhook.port}/api/geofence/all/geojson`, options, config.devOptions.enabled) || {}
+ const templates = await fetchJson(
+ `${webhook.host}:${webhook.port}/api/config/templates?names=true`,
+ options,
+ config.devOptions.enabled,
+ )
+ const areas =
+ (await fetchJson(
+ `${webhook.host}:${webhook.port}/api/geofence/all/geojson`,
+ options,
+ config.devOptions.enabled,
+ )) || {}
if (areas.geoJSON?.features) {
- areas.geoJSON.features = areas.geoJSON.features
- .filter(x => !webhook.areasToSkip.includes(x.properties.name.toLowerCase()))
+ areas.geoJSON.features = areas.geoJSON.features.filter(
+ (x) => !webhook.areasToSkip.includes(x.properties.name.toLowerCase()),
+ )
} else {
console.warn('No geofences found')
}
if (templates) {
- ['discord', 'telegram'].forEach(platform => {
+ ;['discord', 'telegram'].forEach((platform) => {
if (templates[platform].monster) {
templates[platform].pokemon = templates[platform].monster
delete templates[platform].monster
@@ -74,19 +109,29 @@ module.exports = async function initWebhooks(webhook, config) {
nominatimUrl: hookConfig ? hookConfig.providerURL : null,
areasToSkip: webhook.areasToSkip,
},
- client: hookConfig ? {
- ...baseSettings,
- prefix: hookConfig.prefix,
- locale: hookConfig.locale,
- info: webhookUi(webhook.provider, hookConfig, baseSettings.pvp, baseSettings.leagues),
- areas: areas.geoJSON || [],
- templates,
- } : baseSettings,
+ client: hookConfig
+ ? {
+ ...baseSettings,
+ prefix: hookConfig.prefix,
+ locale: hookConfig.locale,
+ info: webhookUi(
+ webhook.provider,
+ hookConfig,
+ baseSettings.pvp,
+ baseSettings.leagues,
+ ),
+ areas: areas.geoJSON || [],
+ templates,
+ }
+ : baseSettings,
}
}
console.log(`[EVENT] ${webhook.name} webhook initialized`)
} catch (e) {
- console.log(config.devOptions.enabled ? e : e.message, 'An error has occurred during webhook initialization')
+ console.log(
+ config.devOptions.enabled ? e : e.message,
+ 'An error has occurred during webhook initialization',
+ )
}
return {}
}
diff --git a/server/src/services/initialization.js b/server/src/services/initialization.js
index bc1166c8a..382101509 100644
--- a/server/src/services/initialization.js
+++ b/server/src/services/initialization.js
@@ -1,15 +1,29 @@
/* eslint-disable no-console */
+const fs = require('fs')
+const { resolve } = require('path')
const {
database: { schemas: exampleSchemas },
} = require('../configs/local.example.json')
const config = require('./config')
-const staticMf = require('../data/masterfile.json')
+
+const staticMf = JSON.parse(
+ fs.readFileSync(resolve(__dirname, '../data/masterfile.json')),
+)
const DbCheck = require('./DbCheck')
const EventManager = require('./EventManager')
const PvpWrapper = require('./PvpWrapper')
-const Db = new DbCheck(exampleSchemas, config.database, config.devOptions.queryDebug, config.api, config.map.distanceUnit)
-const Pvp = config.api.pvp.reactMapHandlesPvp ? new PvpWrapper(config.api.pvp) : null
+
+const Db = new DbCheck(
+ exampleSchemas,
+ config.database,
+ config.devOptions.queryDebug,
+ config.api,
+ config.map.distanceUnit,
+)
+const Pvp = config.api.pvp.reactMapHandlesPvp
+ ? new PvpWrapper(config.api.pvp)
+ : null
const Event = new EventManager(staticMf)
Event.setTimers(config, Db, Pvp)
diff --git a/server/src/services/legacyFilter.js b/server/src/services/legacyFilter.js
index 592fe3360..05b6e7ca4 100644
--- a/server/src/services/legacyFilter.js
+++ b/server/src/services/legacyFilter.js
@@ -5,13 +5,16 @@
/* eslint-disable default-case */
const requireFromString = require('require-from-string')
const {
- api: { pvp: { minCp: pvpMinCp, reactMapHandlesPvp } },
+ api: {
+ pvp: { minCp: pvpMinCp, reactMapHandlesPvp },
+ },
} = require('./config')
const { Pvp, Event } = require('./initialization')
const jsifyIvFilter = (filter) => {
const input = filter.toUpperCase()
- const tokenizer = /\s*([()|&!,]|([ADSL]?|CP|LC|[GU]L)\s*([0-9]+(?:\.[0-9]*)?)(?:\s*-\s*([0-9]+(?:\.[0-9]*)?))?)/g
+ const tokenizer =
+ /\s*([()|&!,]|([ADSL]?|CP|LC|[GU]L)\s*([0-9]+(?:\.[0-9]*)?)(?:\s*-\s*([0-9]+(?:\.[0-9]*)?))?)/g
let result = ''
let expectClause = true // expect a clause or '('
let stack = 0
@@ -27,20 +30,33 @@ const jsifyIvFilter = (filter) => {
let column = 'iv'
let subColumn
switch (match[2]) {
- case 'A': column = 'atk_iv'; break
- case 'D': column = 'def_iv'; break
- case 'S': column = 'sta_iv'; break
- case 'L': column = 'level'; break
- case 'CP': column = 'cp'; break
+ case 'A':
+ column = 'atk_iv'
+ break
+ case 'D':
+ column = 'def_iv'
+ break
+ case 'S':
+ column = 'sta_iv'
+ break
+ case 'L':
+ column = 'level'
+ break
+ case 'CP':
+ column = 'cp'
+ break
case 'GL':
column = 'cleanPvp'
- subColumn = 'great'; break
+ subColumn = 'great'
+ break
case 'UL':
column = 'cleanPvp'
- subColumn = 'ultra'; break
+ subColumn = 'ultra'
+ break
case 'LC':
column = 'cleanPvp'
- subColumn = 'little'; break
+ subColumn = 'little'
+ break
}
let upper = lower
if (match[4] !== undefined) {
@@ -103,16 +119,18 @@ const getLegacy = (results, args, perms, ts) => {
const pokemonLookup = {}
const formLookup = {}
const pokemonFilterIV = { or: args.filters.onlyIvOr.adv }
- Object.keys(args.filters).forEach(pkmn => {
+ Object.keys(args.filters).forEach((pkmn) => {
if (pkmn.charAt(0) !== 'o') {
pokemonFilterIV[pkmn] = args.filters[pkmn].adv
}
})
const interestedLevelCaps = Object.keys(args.filters)
- .filter(x => x.startsWith('onlyPvp') && args.filters[x])
- .map(y => parseInt(y.substring(7)))
- const interestedMegas = args.filters.pvpMega ? [1, 2, 3, 'experimental_stats'] : []
+ .filter((x) => x.startsWith('onlyPvp') && args.filters[x])
+ .map((y) => parseInt(y.substring(7)))
+ const interestedMegas = args.filters.pvpMega
+ ? [1, 2, 3, 'experimental_stats']
+ : []
for (const key of args.filters.onlyLegacyExclude || []) {
if (key === 'global') continue
@@ -120,7 +138,9 @@ const getLegacy = (results, args, perms, ts) => {
if (split.length === 2) {
const pokemonId = parseInt(split[0])
const formId = parseInt(split[1])
- if ((Event.masterfile.pokemon[pokemonId] || {}).defaultFormId === formId) {
+ if (
+ (Event.masterfile.pokemon[pokemonId] || {}).defaultFormId === formId
+ ) {
pokemonLookup[pokemonId] = false
}
formLookup[formId] = false
@@ -145,7 +165,8 @@ const getLegacy = (results, args, perms, ts) => {
console.warn('Unrecognized key', key)
} else {
pokemonLookup[pokemonId] = false
- const defaultForm = (Event.masterfile.pokemon[pokemonId] || {}).defaultFormId
+ const defaultForm = (Event.masterfile.pokemon[pokemonId] || {})
+ .defaultFormId
if (defaultForm) {
formLookup[defaultForm] = false
}
@@ -167,7 +188,9 @@ const getLegacy = (results, args, perms, ts) => {
if (split.length === 2) {
const pokemonId = parseInt(split[0])
const formId = parseInt(split[1])
- if ((Event.masterfile.pokemon[pokemonId] || {}).defaultFormId === formId) {
+ if (
+ (Event.masterfile.pokemon[pokemonId] || {}).defaultFormId === formId
+ ) {
pokemonLookup[pokemonId] = jsFilter
}
formLookup[formId] = jsFilter
@@ -182,7 +205,8 @@ const getLegacy = (results, args, perms, ts) => {
console.warn('Unrecognized key', key)
} else {
pokemonLookup[pokemonId] = jsFilter
- const defaultForm = (Event.masterfile.pokemon[pokemonId] || {}).defaultFormId
+ const defaultForm = (Event.masterfile.pokemon[pokemonId] || {})
+ .defaultFormId
if (defaultForm) {
formLookup[defaultForm] = jsFilter
}
@@ -194,22 +218,37 @@ const getLegacy = (results, args, perms, ts) => {
let bestPvp = 4096
const filterLeagueStats = (pvpResult, target, minCp) => {
let last
- for (const entry of typeof pvpResult === 'string' ? JSON.parse(pvpResult) : pvpResult) {
- if ((minCp && entry.cp < minCp) || (entry.cap !== undefined && (entry.capped
- ? interestedLevelCaps[interestedLevelCaps.length - 1] < entry.cap
- : !interestedLevelCaps.includes(entry.cap)))) {
+ for (const entry of typeof pvpResult === 'string'
+ ? JSON.parse(pvpResult)
+ : pvpResult) {
+ if (
+ (minCp && entry.cp < minCp) ||
+ (entry.cap !== undefined &&
+ (entry.capped
+ ? interestedLevelCaps[interestedLevelCaps.length - 1] < entry.cap
+ : !interestedLevelCaps.includes(entry.cap)))
+ ) {
continue
}
if (entry.evolution) {
- if (Event.masterfile.pokemon[entry.pokemon].tempEvolutions[entry.evolution].unreleased
- ? !interestedMegas.includes('experimental')
- : !interestedMegas.includes(entry.evolution)) {
+ if (
+ Event.masterfile.pokemon[entry.pokemon].tempEvolutions[
+ entry.evolution
+ ].unreleased
+ ? !interestedMegas.includes('experimental')
+ : !interestedMegas.includes(entry.evolution)
+ ) {
continue
}
}
- if (last !== undefined && last.pokemon === entry.pokemon
- && last.form === entry.form && last.evolution === entry.evolution
- && last.level === entry.level && last.rank === entry.rank) {
+ if (
+ last !== undefined &&
+ last.pokemon === entry.pokemon &&
+ last.form === entry.form &&
+ last.evolution === entry.evolution &&
+ last.level === entry.level &&
+ last.rank === entry.rank
+ ) {
last.cap = entry.cap
if (entry.capped) {
last.capped = true
@@ -232,7 +271,8 @@ const getLegacy = (results, args, perms, ts) => {
const filtered = {}
if (result.pokemon_id === 132) {
filtered.ditto_form = result.form
- result.form = Event.masterfile.pokemon[result.pokemon_id]?.defaultFormId || 0
+ result.form =
+ Event.masterfile.pokemon[result.pokemon_id]?.defaultFormId || 0
}
if (!result.seen_type) {
if (result.spawn_id === null) {
@@ -253,21 +293,37 @@ const getLegacy = (results, args, perms, ts) => {
const { great, ultra } = pvpMinCp
filtered.cleanPvp = {}
if (result.pvp || (reactMapHandlesPvp && result.cp)) {
- const pvpResults = reactMapHandlesPvp ? Pvp.resultWithCache(result, ts) : JSON.parse(result.pvp)
- Object.keys(pvpResults).forEach(league => {
- filterLeagueStats(pvpResults[league], filtered.cleanPvp[league] = [])
+ const pvpResults = reactMapHandlesPvp
+ ? Pvp.resultWithCache(result, ts)
+ : JSON.parse(result.pvp)
+ Object.keys(pvpResults).forEach((league) => {
+ filterLeagueStats(
+ pvpResults[league],
+ (filtered.cleanPvp[league] = []),
+ )
})
} else {
if (result.pvp_rankings_great_league) {
- filterLeagueStats(result.pvp_rankings_great_league, filtered.cleanPvp.great = [], great)
+ filterLeagueStats(
+ result.pvp_rankings_great_league,
+ (filtered.cleanPvp.great = []),
+ great,
+ )
}
if (result.pvp_rankings_ultra_league) {
- filterLeagueStats(result.pvp_rankings_ultra_league, filtered.cleanPvp.ultra = [], ultra)
+ filterLeagueStats(
+ result.pvp_rankings_ultra_league,
+ (filtered.cleanPvp.ultra = []),
+ ultra,
+ )
}
}
filtered.bestPvp = bestPvp
}
- let pokemonFilter = result.form === 0 ? pokemonLookup[result.pokemon_id] : formLookup[result.form]
+ let pokemonFilter =
+ result.form === 0
+ ? pokemonLookup[result.pokemon_id]
+ : formLookup[result.form]
if (pokemonFilter === undefined) {
pokemonFilter = andIv(filtered) || orIv(filtered)
} else if (pokemonFilter === false) {
@@ -280,7 +336,9 @@ const getLegacy = (results, args, perms, ts) => {
}
if (!result.seen_type) {
if (result.spawn_id === null) {
- filtered.seen_type = result.pokestop_id ? 'nearby_stop' : 'nearby_cell'
+ filtered.seen_type = result.pokestop_id
+ ? 'nearby_stop'
+ : 'nearby_cell'
} else {
filtered.seen_type = 'encounter'
}
diff --git a/server/src/services/logUserAuth.js b/server/src/services/logUserAuth.js
index bb620d6b7..12f33e906 100644
--- a/server/src/services/logUserAuth.js
+++ b/server/src/services/logUserAuth.js
@@ -2,13 +2,18 @@
const Fetch = require('./Fetch')
module.exports = async function getAuthInfo(req, user, strategy) {
- const ip = req.headers['cf-connecting-ip']
- || ((req.headers['x-forwarded-for'] || '').split(', ')[0])
- || (req.connection.remoteAddress || req.connection.localAddress).match('[0-9]+.[0-9].+[0-9]+.[0-9]+$')[0]
+ const ip =
+ req.headers['cf-connecting-ip'] ||
+ (req.headers['x-forwarded-for'] || '').split(', ')[0] ||
+ (req.connection.remoteAddress || req.connection.localAddress).match(
+ '[0-9]+.[0-9].+[0-9]+.[0-9]+$',
+ )[0]
- const geo = await Fetch.json(`http://ip-api.com/json/${ip}?fields=66846719&lang=en`)
+ const geo = await Fetch.json(
+ `http://ip-api.com/json/${ip}?fields=66846719&lang=en`,
+ )
const embed = {
- color: 0xFF0000,
+ color: 0xff0000,
title: 'Authentication',
author: {
name: `${user.username}`,
@@ -62,13 +67,18 @@ module.exports = async function getAuthInfo(req, user, strategy) {
timestamp: new Date(),
}
if (user.valid) {
- console.log('[DISCORD]', user.username, `(${user.id})`, 'Authenticated successfully.')
+ console.log(
+ '[DISCORD]',
+ user.username,
+ `(${user.id})`,
+ 'Authenticated successfully.',
+ )
embed.description = `${user.username} Successfully Authenticated`
- embed.color = 0x00FF00
+ embed.color = 0x00ff00
} else if (user.blocked) {
console.warn('[DISCORD]', user.id, 'Blocked due to', user.blocked)
embed.description = `User Blocked Due to ${user.blocked}`
- embed.color = 0xFF0000
+ embed.color = 0xff0000
} else {
console.warn('[DISCORD]', user.id, 'Not authorized to access map')
}
diff --git a/server/src/services/sessionStore.js b/server/src/services/sessionStore.js
index 5992c4445..2e7759cff 100644
--- a/server/src/services/sessionStore.js
+++ b/server/src/services/sessionStore.js
@@ -4,7 +4,9 @@ const session = require('express-session')
const MySQLStore = require('express-mysql-session')(session)
const {
api: { maxSessions },
- database: { settings: { sessionTableName } },
+ database: {
+ settings: { sessionTableName },
+ },
} = require('./config')
const Utility = require('./Utility')
const { Session } = require('../models/index')
@@ -36,7 +38,7 @@ const sessionStore = new MySQLStore({
})
const isValidSession = async (userId) => {
- const ts = Math.floor((new Date()).getTime() / 1000)
+ const ts = Math.floor(new Date().getTime() / 1000)
const results = await Session.query()
.select('session_id')
.whereRaw(`json_extract(data, '$.passport.user.id') = ${userId}`)
@@ -54,7 +56,9 @@ const clearOtherSessions = async (userId, currentSessionId) => {
const clearDiscordSessions = async (discordId, botName) => {
const results = await Session.query()
- .whereRaw(`json_extract(data, '$.passport.user.discordId') = '${discordId}'`)
+ .whereRaw(
+ `json_extract(data, '$.passport.user.discordId') = '${discordId}'`,
+ )
.orWhereRaw(`json_extract(data, '$.passport.user.id') = '${discordId}'`)
.delete()
console.log(`[Session${botName && ` - ${botName}`}] Clear Result:`, results)
diff --git a/server/src/services/ui/advMenus.js b/server/src/services/ui/advMenus.js
index 9fe24c476..798835950 100644
--- a/server/src/services/ui/advMenus.js
+++ b/server/src/services/ui/advMenus.js
@@ -3,7 +3,16 @@ const { map } = require('../config')
const categories = {
gyms: ['teams', 'eggs', 'raids', 'pokemon'],
- pokestops: ['lures', 'items', 'quest_reward_12', 'invasions', 'pokemon', 'quest_reward_4', 'quest_reward_9', 'quest_reward_3'],
+ pokestops: [
+ 'lures',
+ 'items',
+ 'quest_reward_12',
+ 'invasions',
+ 'pokemon',
+ 'quest_reward_4',
+ 'quest_reward_9',
+ 'quest_reward_3',
+ ],
pokemon: ['pokemon'],
nests: ['pokemon'],
}
@@ -13,17 +22,21 @@ if (map.enableQuestRewardTypeFilters) {
}
const pokemonFilters = {
- generations: [...new Set(
- Object.values(Event.masterfile.pokemon)
- .map(val => `generation_${val.genId}`),
- )].filter(val => val !== undefined),
+ generations: [
+ ...new Set(
+ Object.values(Event.masterfile.pokemon).map(
+ (val) => `generation_${val.genId}`,
+ ),
+ ),
+ ].filter((val) => val !== undefined),
types: Object.keys(Event.masterfile.types)
- .map(key => `poke_type_${key}`)
- .filter(val => val !== 'poke_type_0'),
- rarity: [...new Set(
- Object.values(Event.masterfile.pokemon)
- .map(val => val.rarity),
- )].filter(val => val !== undefined),
+ .map((key) => `poke_type_${key}`)
+ .filter((val) => val !== 'poke_type_0'),
+ rarity: [
+ ...new Set(
+ Object.values(Event.masterfile.pokemon).map((val) => val.rarity),
+ ),
+ ].filter((val) => val !== undefined),
forms: ['normalForms', 'altForms', 'Alola', 'Galarian'],
others: ['reverse', 'selected', 'unselected', 'onlyAvailable'],
}
@@ -33,7 +46,7 @@ module.exports = function buildMenus() {
const returnedItems = {}
Object.entries(pokemonFilters).forEach(([key, items]) => {
- menuFilters[key] = Object.fromEntries(items.map(item => [item, false]))
+ menuFilters[key] = Object.fromEntries(items.map((item) => [item, false]))
})
Object.entries(categories).forEach(([key, items]) => {
@@ -45,7 +58,7 @@ module.exports = function buildMenus() {
...menuFilters.others,
onlyAvailable: true,
},
- categories: Object.fromEntries(items.map(item => [item, false])),
+ categories: Object.fromEntries(items.map((item) => [item, false])),
},
}
})
diff --git a/server/src/services/ui/clientOptions.js b/server/src/services/ui/clientOptions.js
index 7ffc9f5b5..88ce30657 100644
--- a/server/src/services/ui/clientOptions.js
+++ b/server/src/services/ui/clientOptions.js
@@ -1,7 +1,9 @@
const {
clientSideOptions,
map: { enableMapJsFilter },
- api: { pvp: { levels } },
+ api: {
+ pvp: { levels },
+ },
} = require('../config')
const dbSelection = require('../functions/dbSelection')
@@ -58,9 +60,11 @@ module.exports = function clientOptions(perms) {
},
}
- levels.forEach(level => {
+ levels.forEach((level) => {
clientMenus.pokemon[`pvp${level}`] = {
- type: 'bool', perm: ['pvp'], value: true,
+ type: 'bool',
+ perm: ['pvp'],
+ value: true,
}
})
@@ -78,13 +82,14 @@ module.exports = function clientOptions(perms) {
// only the keys & values are stored locally
const clientValues = {}
- Object.entries(clientMenus).forEach(category => {
+ Object.entries(clientMenus).forEach((category) => {
const [key, options] = category
clientValues[key] = {}
- Object.entries(options).forEach(option => {
+ Object.entries(options).forEach((option) => {
const [name, meta] = option
- clientMenus[key][name].value = clientSideOptions[key][name] || meta.value || false
- clientMenus[key][name].disabled = !meta.perm.some(x => perms[x])
+ clientMenus[key][name].value =
+ clientSideOptions[key][name] || meta.value || false
+ clientMenus[key][name].disabled = !meta.perm.some((x) => perms[x])
clientValues[key][name] = meta.value
if (meta.sub) clientMenus[key][name].sub = {}
delete clientMenus[key][name].perm
@@ -93,7 +98,7 @@ module.exports = function clientOptions(perms) {
clientMenus.pokemon.glow.value = true
clientValues.pokemon.glow = true
- clientSideOptions.pokemon.glow.forEach(option => {
+ clientSideOptions.pokemon.glow.forEach((option) => {
clientMenus.pokemon.glow.sub[option.name] = { ...option }
clientMenus.pokemon.glow.sub[option.name].disabled = !perms[option.perm]
clientMenus.pokemon.glow.sub[option.name].type = 'color'
diff --git a/server/src/services/ui/primary.js b/server/src/services/ui/primary.js
index 2967225af..10d327e18 100644
--- a/server/src/services/ui/primary.js
+++ b/server/src/services/ui/primary.js
@@ -1,12 +1,23 @@
/* eslint-disable no-restricted-syntax */
const {
- api: { pvp: { leagues } },
- defaultFilters: { nests: { avgSliderStep } },
+ api: {
+ pvp: { leagues },
+ },
+ defaultFilters: {
+ nests: { avgSliderStep },
+ },
} = require('../config')
module.exports = function generateUi(filters, perms) {
const ui = {}
- const ignoredKeys = ['enabled', 'filter', 'showQuestSet', 'badge', 'avgFilter', 'raidTier']
+ const ignoredKeys = [
+ 'enabled',
+ 'filter',
+ 'showQuestSet',
+ 'badge',
+ 'avgFilter',
+ 'raidTier',
+ ]
// builds the initial categories
for (const [key, value] of Object.entries(filters)) {
@@ -18,68 +29,119 @@ module.exports = function generateUi(filters, perms) {
sliders = {
secondary: [
{
- name: 'avgFilter', i18nKey: 'spawns_per_hour', label: '', min: filters.nests.avgFilter[0], max: filters.nests.avgFilter[1], perm: 'nests', step: avgSliderStep,
+ name: 'avgFilter',
+ i18nKey: 'spawns_per_hour',
+ label: '',
+ min: filters.nests.avgFilter[0],
+ max: filters.nests.avgFilter[1],
+ perm: 'nests',
+ step: avgSliderStep,
},
],
- }; break
+ }
+ break
case 'pokemon':
ui[key] = {}
sliders = {
primary: [
{
- name: 'iv', label: '%', min: 0, max: 100, perm: 'iv', color: 'secondary',
+ name: 'iv',
+ label: '%',
+ min: 0,
+ max: 100,
+ perm: 'iv',
+ color: 'secondary',
},
],
secondary: [
{
- name: 'level', label: '', min: 1, max: 35, perm: 'iv',
+ name: 'level',
+ label: '',
+ min: 1,
+ max: 35,
+ perm: 'iv',
},
{
- name: 'atk_iv', label: '', min: 0, max: 15, perm: 'iv',
+ name: 'atk_iv',
+ label: '',
+ min: 0,
+ max: 15,
+ perm: 'iv',
},
{
- name: 'def_iv', label: '', min: 0, max: 15, perm: 'iv',
+ name: 'def_iv',
+ label: '',
+ min: 0,
+ max: 15,
+ perm: 'iv',
},
{
- name: 'sta_iv', label: '', min: 0, max: 15, perm: 'iv',
+ name: 'sta_iv',
+ label: '',
+ min: 0,
+ max: 15,
+ perm: 'iv',
},
],
}
- leagues.forEach(league => sliders.primary.push({
- name: league.name, label: 'rank', min: (league.minRank || 1), max: (league.maxRank || 100), perm: 'pvp', color: 'primary',
- })); break
+ leagues.forEach((league) =>
+ sliders.primary.push({
+ name: league.name,
+ label: 'rank',
+ min: league.minRank || 1,
+ max: league.maxRank || 100,
+ perm: 'pvp',
+ color: 'primary',
+ }),
+ )
+ break
case 'submissionCells':
case 'portals':
if (!ui.wayfarer) ui.wayfarer = {}
- ui.wayfarer[key] = true; break
+ ui.wayfarer[key] = true
+ break
case 'spawnpoints':
case 'scanCells':
case 'devices':
if (!ui.admin) ui.admin = {}
- ui.admin[key] = true; break
- default: ui[key] = {}; break
+ ui.admin[key] = true
+ break
+ default:
+ ui[key] = {}
+ break
}
// builds each subcategory
for (const [subKey, subValue] of Object.entries(value)) {
- if ((!ignoredKeys.includes(subKey) && subValue !== undefined)
- || key === 'weather' || key === 'scanAreas') {
+ if (
+ (!ignoredKeys.includes(subKey) && subValue !== undefined) ||
+ key === 'weather' ||
+ key === 'scanAreas'
+ ) {
switch (key) {
case 'submissionCells':
- case 'portals': ui.wayfarer[key] = true; break
+ case 'portals':
+ ui.wayfarer[key] = true
+ break
case 'spawnpoints':
case 'scanCells':
- case 'devices': ui.admin[key] = true; break
+ case 'devices':
+ ui.admin[key] = true
+ break
case 'scanAreas':
- case 'weather': ui[key].enabled = true; break
- default: ui[key][subKey] = true; break
+ case 'weather':
+ ui[key].enabled = true
+ break
+ default:
+ ui[key][subKey] = true
+ break
}
}
}
// adds any sliders present
if (sliders) {
ui[key].sliders = sliders
- Object.keys(sliders).forEach(category => {
- sliders[category].forEach(slider => {
+ Object.keys(sliders).forEach((category) => {
+ sliders[category].forEach((slider) => {
slider.disabled = !perms[slider.perm]
if (!slider.color) {
slider.color = category
@@ -91,7 +153,7 @@ module.exports = function generateUi(filters, perms) {
}
// deletes any menus that do not have any items/perms
- Object.keys(ui).forEach(category => {
+ Object.keys(ui).forEach((category) => {
if (Object.keys(ui[category]).length === 0) {
delete ui[category]
}
diff --git a/server/src/services/ui/webhook.js b/server/src/services/ui/webhook.js
index 95cafe9c1..b408ec2f9 100644
--- a/server/src/services/ui/webhook.js
+++ b/server/src/services/ui/webhook.js
@@ -41,24 +41,84 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
byDistance: false,
xs: false,
xl: false,
- everything_individually: hookConfig.everythingFlagPermissions === 'allow-and-always-individually'
- || hookConfig.everythingFlagPermissions === 'deny',
+ everything_individually:
+ hookConfig.everythingFlagPermissions ===
+ 'allow-and-always-individually' ||
+ hookConfig.everythingFlagPermissions === 'deny',
},
ui: {
primary: {
sliders: [
- { name: 'iv', label: '', min: -1, max: 100, perm: 'iv', low: 'min_iv', high: 'max_iv' },
- { name: 'level', label: '', min: 0, max: 40, perm: 'iv', low: 'min_level', high: 'max_level' },
+ {
+ name: 'iv',
+ label: '',
+ min: -1,
+ max: 100,
+ perm: 'iv',
+ low: 'min_iv',
+ high: 'max_iv',
+ },
+ {
+ name: 'level',
+ label: '',
+ min: 0,
+ max: 40,
+ perm: 'iv',
+ low: 'min_level',
+ high: 'max_level',
+ },
],
},
advanced: {
sliders: [
- { name: 'cp', label: '', min: 0, max: 9000, perm: 'iv', low: 'min_cp', high: 'max_cp' },
- { name: 'atk_iv', label: '', min: 0, max: 15, perm: 'iv', low: 'atk', high: 'max_atk' },
- { name: 'def_iv', label: '', min: 0, max: 15, perm: 'iv', low: 'def', high: 'max_def' },
- { name: 'sta_iv', label: '', min: 0, max: 15, perm: 'iv', low: 'sta', high: 'max_sta' },
+ {
+ name: 'cp',
+ label: '',
+ min: 0,
+ max: 9000,
+ perm: 'iv',
+ low: 'min_cp',
+ high: 'max_cp',
+ },
+ {
+ name: 'atk_iv',
+ label: '',
+ min: 0,
+ max: 15,
+ perm: 'iv',
+ low: 'atk',
+ high: 'max_atk',
+ },
+ {
+ name: 'def_iv',
+ label: '',
+ min: 0,
+ max: 15,
+ perm: 'iv',
+ low: 'def',
+ high: 'max_def',
+ },
+ {
+ name: 'sta_iv',
+ label: '',
+ min: 0,
+ max: 15,
+ perm: 'iv',
+ low: 'sta',
+ high: 'max_sta',
+ },
+ ],
+ texts: [
+ {
+ name: 'min_time',
+ type: 'number',
+ max: 60,
+ adornment: 's',
+ xs: 4,
+ sm: 4,
+ width: 100,
+ },
],
- texts: [{ name: 'min_time', type: 'number', max: 60, adornment: 's', xs: 4, sm: 4, width: 100 }],
booleans: [
{ name: 'xs', xs: 4, sm: 4, override: true },
{ name: 'xl', xs: 4, sm: 4, override: true },
@@ -66,13 +126,46 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
},
pvp: {
selects: [
- { name: 'pvp_ranking_league', options: [{ name: 'none', cp: 0 }, ...leagues], xs: 6, sm: 3 },
- ...(isOhbem ? [{ name: 'pvp_ranking_cap', options: [0, ...(hookConfig.pvpCaps || [])], xs: 6, sm: 3 }] : []),
+ {
+ name: 'pvp_ranking_league',
+ options: [{ name: 'none', cp: 0 }, ...leagues],
+ xs: 6,
+ sm: 3,
+ },
+ ...(isOhbem
+ ? [
+ {
+ name: 'pvp_ranking_cap',
+ options: [0, ...(hookConfig.pvpCaps || [])],
+ xs: 6,
+ sm: 3,
+ },
+ ]
+ : []),
],
texts: isOhbem
? []
- : [{ name: 'pvp_ranking_min_cp', type: 'number', adornment: 'cp', width: 110, xs: 6, sm: 3 }],
- sliders: [{ name: 'pvp', label: 'rank', min: 1, max: hookConfig.pvpFilterMaxRank, perm: 'pvp', low: 'pvp_ranking_best', high: 'pvp_ranking_worst' }],
+ : [
+ {
+ name: 'pvp_ranking_min_cp',
+ type: 'number',
+ adornment: 'cp',
+ width: 110,
+ xs: 6,
+ sm: 3,
+ },
+ ],
+ sliders: [
+ {
+ name: 'pvp',
+ label: 'rank',
+ min: 1,
+ max: hookConfig.pvpFilterMaxRank,
+ perm: 'pvp',
+ low: 'pvp_ranking_best',
+ high: 'pvp_ranking_worst',
+ },
+ ],
},
general: {
selects: [
@@ -87,8 +180,24 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
{ name: 'noIv', xs: 6, sm: 3 },
],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
global: {
@@ -112,8 +221,10 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
byDistance: false,
allMoves: true,
allForms: true,
- everything_individually: hookConfig.everythingFlagPermissions === 'allow-and-always-individually'
- || hookConfig.everythingFlagPermissions === 'deny',
+ everything_individually:
+ hookConfig.everythingFlagPermissions ===
+ 'allow-and-always-individually' ||
+ hookConfig.everythingFlagPermissions === 'deny',
},
ui: {
general: {
@@ -129,10 +240,34 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
{ name: 'allForms', disabled: ['r'], xs: 6, sm: 3 },
{ name: 'allMoves', disabled: ['r'], xs: 6, sm: 3 },
],
- autoComplete: [{ name: 'gymName', label: 'gym', searchCategory: 'gyms', xs: 12, sm: 12 }],
+ autoComplete: [
+ {
+ name: 'gymName',
+ label: 'gym',
+ searchCategory: 'gyms',
+ xs: 12,
+ sm: 12,
+ },
+ ],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
global: {
@@ -150,8 +285,10 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
team: 4,
gym_id: null,
byDistance: false,
- everything_individually: hookConfig.everythingFlagPermissions === 'allow-and-always-individually'
- || hookConfig.everythingFlagPermissions === 'deny',
+ everything_individually:
+ hookConfig.everythingFlagPermissions ===
+ 'allow-and-always-individually' ||
+ hookConfig.everythingFlagPermissions === 'deny',
},
ui: {
general: {
@@ -164,10 +301,34 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
{ name: 'clean', xs: 6, sm: 6 },
{ name: 'exclusive', xs: 6, sm: 6 },
],
- autoComplete: [{ name: 'gymName', label: 'gym', searchCategory: 'gyms', xs: 12, sm: 12 }],
+ autoComplete: [
+ {
+ name: 'gymName',
+ label: 'gym',
+ searchCategory: 'gyms',
+ xs: 12,
+ sm: 12,
+ },
+ ],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
global: {
@@ -185,8 +346,10 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
battle_changes: false,
gym_id: null,
byDistance: false,
- everything_individually: hookConfig.everythingFlagPermissions === 'allow-and-always-individually'
- || hookConfig.everythingFlagPermissions === 'deny',
+ everything_individually:
+ hookConfig.everythingFlagPermissions ===
+ 'allow-and-always-individually' ||
+ hookConfig.everythingFlagPermissions === 'deny',
},
ui: {
general: {
@@ -196,13 +359,39 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
],
booleans: [
{ name: 'clean', xs: 4, sm: 4 },
- ...(hookConfig.gymBattles ? [{ name: 'battle_changes', xs: 6, sm: 4 }] : []),
+ ...(hookConfig.gymBattles
+ ? [{ name: 'battle_changes', xs: 6, sm: 4 }]
+ : []),
{ name: 'slot_changes', xs: 6, sm: 4 },
],
- autoComplete: [{ name: 'gymName', label: 'gym', searchCategory: 'gyms', xs: 12, sm: 12 }],
+ autoComplete: [
+ {
+ name: 'gymName',
+ label: 'gym',
+ searchCategory: 'gyms',
+ xs: 12,
+ sm: 12,
+ },
+ ],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
global: {
@@ -218,8 +407,10 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
grunt_type: null,
gender: 0,
byDistance: false,
- everything_individually: hookConfig.everythingFlagPermissions === 'allow-and-always-individually'
- || hookConfig.everythingFlagPermissions === 'deny',
+ everything_individually:
+ hookConfig.everythingFlagPermissions ===
+ 'allow-and-always-individually' ||
+ hookConfig.everythingFlagPermissions === 'deny',
},
ui: {
general: {
@@ -227,12 +418,26 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
{ name: 'profile_no', options: [], xs: 4, sm: 4 },
{ name: 'template', options: [], xs: 4, sm: 4 },
],
- booleans: [
- { name: 'clean', xs: 4, sm: 4 },
- ],
+ booleans: [{ name: 'clean', xs: 4, sm: 4 }],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
global: {
@@ -254,12 +459,26 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
{ name: 'profile_no', options: [], xs: 4, sm: 4 },
{ name: 'template', options: [], xs: 4, sm: 4 },
],
- booleans: [
- { name: 'clean', xs: 4, sm: 4 },
- ],
+ booleans: [{ name: 'clean', xs: 4, sm: 4 }],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
},
@@ -285,12 +504,41 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
],
booleans: [
{ name: 'clean', xs: 4, sm: 4 },
- { name: 'allForms', xs: 6, sm: 6, disabled: ['m', 'x', 'd', 'c', 'q'] },
+ {
+ name: 'allForms',
+ xs: 6,
+ sm: 6,
+ disabled: ['m', 'x', 'd', 'c', 'q'],
+ },
+ ],
+ texts: [
+ {
+ name: 'amount',
+ type: 'number',
+ disabled: ['m', 'd', 'g'],
+ xs: 6,
+ sm: 6,
+ },
],
- texts: [{ name: 'amount', type: 'number', disabled: ['m', 'd', 'g'], xs: 6, sm: 6 }],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
},
@@ -318,21 +566,46 @@ module.exports = function webhookUi(provider, hookConfig, pvp, leagues) {
],
texts: [{ name: 'min_spawn_avg', type: 'number', xs: 6, sm: 6 }],
distanceOrArea: {
- booleans: [{ name: 'byDistance', max: hookConfig.maxDistance, xs: 6, sm: 8, override: true }],
- texts: [{ name: 'distance', type: 'number', adornment: 'm', xs: 6, sm: 4 }],
+ booleans: [
+ {
+ name: 'byDistance',
+ max: hookConfig.maxDistance,
+ xs: 6,
+ sm: 8,
+ override: true,
+ },
+ ],
+ texts: [
+ {
+ name: 'distance',
+ type: 'number',
+ adornment: 'm',
+ xs: 6,
+ sm: 4,
+ },
+ ],
},
},
},
},
}
- Object.values(poracleUiObj).forEach(category => {
- if (typeof category === 'object' && category?.ui?.global
- && hookConfig.everythingFlagPermissions === 'allow-any') {
- category.ui.global.booleans.push({ name: 'everything_individually', xs: 12, sm: 12, override: true })
+ Object.values(poracleUiObj).forEach((category) => {
+ if (
+ typeof category === 'object' &&
+ category?.ui?.global &&
+ hookConfig.everythingFlagPermissions === 'allow-any'
+ ) {
+ category.ui.global.booleans.push({
+ name: 'everything_individually',
+ xs: 12,
+ sm: 12,
+ override: true,
+ })
}
})
return poracleUiObj
}
- default: return {}
+ default:
+ return {}
}
}
diff --git a/server/src/strategies/discord.js b/server/src/strategies/discord.js
index 46a34a9b4..96331aad1 100644
--- a/server/src/strategies/discord.js
+++ b/server/src/strategies/discord.js
@@ -53,7 +53,11 @@ const authHandler = async (req, accessToken, refreshToken, profile, done) => {
.then(async (userExists) => {
if (req.user && userExists?.strategy === 'local') {
await User.query()
- .update({ discordId: user.id, discordPerms: JSON.stringify(user.perms), webhookStrategy: 'discord' })
+ .update({
+ discordId: user.id,
+ discordPerms: JSON.stringify(user.perms),
+ webhookStrategy: 'discord',
+ })
.where('id', req.user.id)
await User.query()
.where('discordId', user.id)
@@ -68,8 +72,11 @@ const authHandler = async (req, accessToken, refreshToken, profile, done) => {
})
}
if (!userExists) {
- userExists = await User.query()
- .insertAndFetch({ discordId: user.id, strategy: 'discord', tutorial: !forceTutorial })
+ userExists = await User.query().insertAndFetch({
+ discordId: user.id,
+ strategy: 'discord',
+ tutorial: !forceTutorial,
+ })
}
if (userExists.strategy !== 'discord') {
await User.query()
@@ -78,19 +85,31 @@ const authHandler = async (req, accessToken, refreshToken, profile, done) => {
userExists.strategy = 'discord'
}
if (userExists.id >= 25000) {
- console.warn('[USER] User ID is higher than 25,000! This may indicate that a Discord ID was saved as the User ID\nYou should rerun the migrations with "yarn migrate:rollback && yarn migrate:latest"')
+ console.warn(
+ '[USER] User ID is higher than 25,000! This may indicate that a Discord ID was saved as the User ID\nYou should rerun the migrations with "yarn migrate:rollback && yarn migrate:latest"',
+ )
}
- return done(null, { ...user, ...userExists, username: userExists.username || user.username })
+ return done(null, {
+ ...user,
+ ...userExists,
+ username: userExists.username || user.username,
+ })
})
} catch (e) {
console.error('[AUTH] User has failed Discord auth.', e)
}
}
-passport.use(path.parse(__filename).name, new DiscordStrategy({
- clientID: strategyConfig.clientId,
- clientSecret: strategyConfig.clientSecret,
- callbackURL: strategyConfig.redirectUri,
- scope: ['identify', 'guilds'],
- passReqToCallback: true,
-}, authHandler))
+passport.use(
+ path.parse(__filename).name,
+ new DiscordStrategy(
+ {
+ clientID: strategyConfig.clientId,
+ clientSecret: strategyConfig.clientSecret,
+ callbackURL: strategyConfig.redirectUri,
+ scope: ['identify', 'guilds'],
+ passReqToCallback: true,
+ },
+ authHandler,
+ ),
+)
diff --git a/server/src/strategies/local.js b/server/src/strategies/local.js
index 95f4a9975..48d46b77d 100644
--- a/server/src/strategies/local.js
+++ b/server/src/strategies/local.js
@@ -6,7 +6,11 @@ const path = require('path')
const {
map: { forceTutorial },
- authentication: { [path.parse(__filename).name]: strategyConfig, alwaysEnabledPerms, perms },
+ authentication: {
+ [path.parse(__filename).name]: strategyConfig,
+ alwaysEnabledPerms,
+ perms,
+ },
} = require('../services/config')
const { User } = require('../models/index')
const Utility = require('../services/Utility')
@@ -16,12 +20,16 @@ if (strategyConfig.doNothing) {
}
const authHandler = async (req, username, password, done) => {
- const localPerms = Object.keys(perms).filter(key => perms[key].roles.includes('local'))
+ const localPerms = Object.keys(perms).filter((key) =>
+ perms[key].roles.includes('local'),
+ )
const user = {
perms: {
...Object.fromEntries(
- Object.keys(perms)
- .map(perm => [perm, localPerms.includes(perm) || alwaysEnabledPerms.includes(perm)]),
+ Object.keys(perms).map((perm) => [
+ perm,
+ localPerms.includes(perm) || alwaysEnabledPerms.includes(perm),
+ ]),
),
areaRestrictions: Utility.areaPerms(localPerms, 'local'),
webhooks: [],
@@ -35,22 +43,26 @@ const authHandler = async (req, username, password, done) => {
.then(async (userExists) => {
if (!userExists) {
try {
- const newUser = await User.query()
- .insertAndFetch({
- username,
- password: await bcrypt.hash(password, 10),
- strategy: 'local',
- tutorial: !forceTutorial,
- })
+ const newUser = await User.query().insertAndFetch({
+ username,
+ password: await bcrypt.hash(password, 10),
+ strategy: 'local',
+ tutorial: !forceTutorial,
+ })
user.id = newUser.id
- console.log('[LOCAL]', user.username, `(${user.id})`, 'Authenticated successfully.')
+ console.log(
+ '[LOCAL]',
+ user.username,
+ `(${user.id})`,
+ 'Authenticated successfully.',
+ )
return done(null, user)
} catch (e) {
return done(null, user, { message: 'error_creating_user' })
}
}
if (bcrypt.compareSync(password, userExists.password)) {
- ['discordPerms', 'telegramPerms'].forEach((permSet) => {
+ ;['discordPerms', 'telegramPerms'].forEach((permSet) => {
if (userExists[permSet]) {
user.perms = Utility.mergePerms(user.perms, userExists[permSet])
}
@@ -62,7 +74,12 @@ const authHandler = async (req, username, password, done) => {
userExists.strategy = 'local'
}
user.id = userExists.id
- console.log('[LOCAL]', user.username, `(${user.id})`, 'Authenticated successfully.')
+ console.log(
+ '[LOCAL]',
+ user.username,
+ `(${user.id})`,
+ 'Authenticated successfully.',
+ )
return done(null, user)
}
return done(null, false, { message: 'invalid_credentials' })
@@ -72,8 +89,14 @@ const authHandler = async (req, username, password, done) => {
}
}
-passport.use(path.parse(__filename).name, new Strategy({
- usernameField: 'username',
- passwordField: 'password',
- passReqToCallback: true,
-}, authHandler))
+passport.use(
+ path.parse(__filename).name,
+ new Strategy(
+ {
+ usernameField: 'username',
+ passwordField: 'password',
+ passReqToCallback: true,
+ },
+ authHandler,
+ ),
+)
diff --git a/server/src/strategies/telegram.js b/server/src/strategies/telegram.js
index 604325528..38846624e 100644
--- a/server/src/strategies/telegram.js
+++ b/server/src/strategies/telegram.js
@@ -5,7 +5,11 @@ const path = require('path')
const {
map: { forceTutorial },
- authentication: { [path.parse(__filename).name]: strategyConfig, perms, alwaysEnabledPerms },
+ authentication: {
+ [path.parse(__filename).name]: strategyConfig,
+ perms,
+ alwaysEnabledPerms,
+ },
} = require('../services/config')
const { User } = require('../models/index')
const Fetch = require('../services/Fetch')
@@ -15,34 +19,50 @@ const authHandler = async (req, profile, done) => {
const user = {
...profile,
perms: {
- ...Object.fromEntries(Object.keys(perms).map(x => [x, false])),
+ ...Object.fromEntries(Object.keys(perms).map((x) => [x, false])),
areaRestrictions: [],
webhooks: [],
},
}
const chatInfo = [user.id]
- await Promise.all(strategyConfig.groups.map(async (group) => {
- try {
- const response = await Fetch.json(`https://api.telegram.org/bot${strategyConfig.botToken}/getChatMember?chat_id=${group}&user_id=${user.id}`)
- if (!response) {
- throw new Error('Unable to query TG API or User is not in the group')
- }
- if (!response.ok) {
- throw new Error(`Telegram API error: ${response.status} ${response.statusText}`)
- }
- if (response.result.status !== 'left' && response.result.status !== 'kicked') {
- chatInfo.push(group)
+ await Promise.all(
+ strategyConfig.groups.map(async (group) => {
+ try {
+ const response = await Fetch.json(
+ `https://api.telegram.org/bot${strategyConfig.botToken}/getChatMember?chat_id=${group}&user_id=${user.id}`,
+ )
+ if (!response) {
+ throw new Error('Unable to query TG API or User is not in the group')
+ }
+ if (!response.ok) {
+ throw new Error(
+ `Telegram API error: ${response.status} ${response.statusText}`,
+ )
+ }
+ if (
+ response.result.status !== 'left' &&
+ response.result.status !== 'kicked'
+ ) {
+ chatInfo.push(group)
+ }
+ } catch (e) {
+ console.error(
+ e.message,
+ `Telegram Group: ${group}`,
+ `User: ${user.id} (${user.username})`,
+ )
+ return null
}
- } catch (e) {
- console.error(e.message, `Telegram Group: ${group}`, `User: ${user.id} (${user.username})`)
- return null
- }
- }))
+ }),
+ )
Object.entries(perms).forEach(([perm, info]) => {
- if (info.enabled && (alwaysEnabledPerms.includes(perm)
- || info.roles.some(role => chatInfo.includes(role)))) {
+ if (
+ info.enabled &&
+ (alwaysEnabledPerms.includes(perm) ||
+ info.roles.some((role) => chatInfo.includes(role)))
+ ) {
user.perms[perm] = true
}
})
@@ -57,13 +77,22 @@ const authHandler = async (req, profile, done) => {
.then(async (userExists) => {
if (req.user && userExists?.strategy === 'local') {
await User.query()
- .update({ telegramId: user.id, telegramPerms: JSON.stringify(user.perms), webhookStrategy: 'telegram' })
+ .update({
+ telegramId: user.id,
+ telegramPerms: JSON.stringify(user.perms),
+ webhookStrategy: 'telegram',
+ })
.where('id', req.user.id)
await User.query()
.where('telegramId', user.id)
.whereNot('id', req.user.id)
.delete()
- console.log('[TELEGRAM]', user.username, `(${user.id})`, 'Authenticated successfully.')
+ console.log(
+ '[TELEGRAM]',
+ user.username,
+ `(${user.id})`,
+ 'Authenticated successfully.',
+ )
return done(null, {
...user,
...req.user,
@@ -73,8 +102,11 @@ const authHandler = async (req, profile, done) => {
})
}
if (!userExists) {
- userExists = await User.query()
- .insertAndFetch({ telegramId: user.id, strategy: user.provider, tutorial: !forceTutorial })
+ userExists = await User.query().insertAndFetch({
+ telegramId: user.id,
+ strategy: user.provider,
+ tutorial: !forceTutorial,
+ })
}
if (userExists.strategy !== 'telegram') {
await User.query()
@@ -83,17 +115,34 @@ const authHandler = async (req, profile, done) => {
userExists.strategy = 'telegram'
}
if (userExists.id >= 25000) {
- console.warn('[USER] User ID is higher than 25,000! This may indicate that a Telegram ID was saved as the User ID\nYou should rerun the migrations with "yarn migrate:rollback && yarn migrate:latest"')
+ console.warn(
+ '[USER] User ID is higher than 25,000! This may indicate that a Telegram ID was saved as the User ID\nYou should rerun the migrations with "yarn migrate:rollback && yarn migrate:latest"',
+ )
}
- console.log('[TELEGRAM]', user.username, `(${user.id})`, 'Authenticated successfully.')
- return done(null, { ...user, ...userExists, username: userExists.username || user.username })
+ console.log(
+ '[TELEGRAM]',
+ user.username,
+ `(${user.id})`,
+ 'Authenticated successfully.',
+ )
+ return done(null, {
+ ...user,
+ ...userExists,
+ username: userExists.username || user.username,
+ })
})
} catch (e) {
console.error('[TELEGRAM] User has failed Telegram auth.', e)
}
}
-passport.use(path.parse(__filename).name, new TelegramStrategy({
- botToken: strategyConfig.botToken,
- passReqToCallback: true,
-}, authHandler))
+passport.use(
+ path.parse(__filename).name,
+ new TelegramStrategy(
+ {
+ botToken: strategyConfig.botToken,
+ passReqToCallback: true,
+ },
+ authHandler,
+ ),
+)
diff --git a/src/assets/mui/theme.js b/src/assets/mui/theme.js
index 5ac2a01e8..1d114f344 100644
--- a/src/assets/mui/theme.js
+++ b/src/assets/mui/theme.js
@@ -2,80 +2,82 @@ import { responsiveFontSizes } from '@material-ui/core'
import { createTheme } from '@material-ui/core/styles'
export default function setTheme(theme) {
- return responsiveFontSizes(createTheme({
- palette: {
- type: 'dark',
- primary: {
- light: '#ff784e',
- main: theme?.primary || '#ff5722',
- dark: '#b23c17',
- contrastText: '#fff',
- },
- secondary: {
- light: '#33bfff',
- main: theme?.secondary || '#00b0ff',
- dark: '#007bb2',
- contrastText: '#fff',
- },
- action: {
- main: '#00e676',
- contrastText: '#fff',
- active: '#00e676',
- },
- grey: {
- light: '#bdbdbd',
- main: '#333333',
- dark: '#424242',
- contrastText: '#fff',
- },
- background: {
- paper: '#333333',
- default: '#333333',
- },
- text: {
- primary: '#f5f5f5',
- secondary: 'white',
- hint: '#a0a0a0',
- },
- },
- props: {
- MuiButtonBase: {
- disableRipple: true,
- },
- },
- overrides: {
- MuiDialogTitle: {
- root: {
- padding: '12px 24px',
+ return responsiveFontSizes(
+ createTheme({
+ palette: {
+ type: 'dark',
+ primary: {
+ light: '#ff784e',
+ main: theme?.primary || '#ff5722',
+ dark: '#b23c17',
+ contrastText: '#fff',
+ },
+ secondary: {
+ light: '#33bfff',
+ main: theme?.secondary || '#00b0ff',
+ dark: '#007bb2',
+ contrastText: '#fff',
+ },
+ action: {
+ main: '#00e676',
+ contrastText: '#fff',
+ active: '#00e676',
+ },
+ grey: {
+ light: '#bdbdbd',
+ main: '#333333',
+ dark: '#424242',
+ contrastText: '#fff',
+ },
+ background: {
+ paper: '#333333',
+ default: '#333333',
+ },
+ text: {
+ primary: '#f5f5f5',
+ secondary: 'white',
+ hint: '#a0a0a0',
},
},
- MuiAccordion: {
- root: {
- '&$expanded': {
- margin: '1px 0',
- },
+ props: {
+ MuiButtonBase: {
+ disableRipple: true,
},
},
- MuiAccordionSummary: {
- root: {
- '&$expanded': {
- minHeight: 10,
+ overrides: {
+ MuiDialogTitle: {
+ root: {
+ padding: '12px 24px',
},
},
- content: {
- '&$expanded': {
- margin: '10px 0',
+ MuiAccordion: {
+ root: {
+ '&$expanded': {
+ margin: '1px 0',
+ },
},
},
- },
- MuiSelect: {
- icon: {
- color: 'white',
+ MuiAccordionSummary: {
+ root: {
+ '&$expanded': {
+ minHeight: 10,
+ },
+ },
+ content: {
+ '&$expanded': {
+ margin: '10px 0',
+ },
+ },
},
- iconOpen: {
- color: 'white',
+ MuiSelect: {
+ icon: {
+ color: 'white',
+ },
+ iconOpen: {
+ color: 'white',
+ },
},
},
- },
- }))
+ }),
+ )
}
diff --git a/src/components/Clustering.jsx b/src/components/Clustering.jsx
index 3e38a4d20..0ecfafbbe 100644
--- a/src/components/Clustering.jsx
+++ b/src/components/Clustering.jsx
@@ -7,18 +7,32 @@ import Notification from './layout/general/Notification'
const ignoredClustering = ['devices', 'submissionCells', 'scanCells', 'weather']
export default function Clustering({
- category, renderedData, userSettings, clusteringRules, staticUserSettings, params,
- filters, map, Icons, perms, tileStyle, config, userIcons, setParams, isNight,
+ category,
+ renderedData,
+ userSettings,
+ clusteringRules,
+ staticUserSettings,
+ params,
+ filters,
+ map,
+ Icons,
+ perms,
+ tileStyle,
+ config,
+ userIcons,
+ setParams,
+ isNight,
}) {
const Component = index[category]
- const hideList = useStatic(state => state.hideList)
- const excludeList = useStatic(state => state.excludeList)
- const timerList = useStatic(state => state.timerList)
+ const hideList = useStatic((state) => state.hideList)
+ const excludeList = useStatic((state) => state.excludeList)
+ const timerList = useStatic((state) => state.timerList)
const ts = Math.floor(Date.now() / 1000)
const currentZoom = map.getZoom()
- const showCircles = userSettings.interactionRanges && currentZoom >= config.interactionRangeZoom
+ const showCircles =
+ userSettings.interactionRanges && currentZoom >= config.interactionRangeZoom
const finalData = renderedData.map((each) => {
if (!each) return null
@@ -51,8 +65,9 @@ export default function Clustering({
return null
})
- const limitHit = finalData.length > clusteringRules.forcedLimit
- && !ignoredClustering.includes(category)
+ const limitHit =
+ finalData.length > clusteringRules.forcedLimit &&
+ !ignoredClustering.includes(category)
return limitHit || (clusteringRules.zoomLevel && userSettings.clustering) ? (
<>
@@ -80,5 +95,7 @@ export default function Clustering({
/>
)}
>
- ) : finalData
+ ) : (
+ finalData
+ )
}
diff --git a/src/components/Config.jsx b/src/components/Config.jsx
index 1d27f925b..c21c44381 100644
--- a/src/components/Config.jsx
+++ b/src/components/Config.jsx
@@ -25,9 +25,17 @@ export default function Config() {
const data = await Fetch.getSettings()
if (data?.config && data?.masterfile) {
if (data.masterfile?.questRewardTypes) {
- localStorage.setItem('questRewardTypes', JSON.stringify(data.masterfile.questRewardTypes))
+ localStorage.setItem(
+ 'questRewardTypes',
+ JSON.stringify(data.masterfile.questRewardTypes),
+ )
}
- const Icons = new UIcons(data.config.icons, data.masterfile ? data.masterfile.questRewardTypes : JSON.parse(localStorage.getItem('questRewardTypes')))
+ const Icons = new UIcons(
+ data.config.icons,
+ data.masterfile
+ ? data.masterfile.questRewardTypes
+ : JSON.parse(localStorage.getItem('questRewardTypes')),
+ )
if (Icons) {
Icons.build(data.config.icons.styles)
if (data.config.icons.defaultIcons) {
@@ -53,9 +61,16 @@ export default function Config() {
return (