Skip to content
4 changes: 2 additions & 2 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ const { writeHeapSnapshot } = require('v8')

const fs = require('fs')
const util = require('util')
const { S2 } = require('s2-geometry')
const { Worker, MessageChannel } = require('worker_threads')
const path = require('path')
const { S2 } = require('s2-geometry')
const NodeCache = require('node-cache')
const pcache = require('flat-cache')
const fastify = require('fastify')({
Expand All @@ -17,7 +18,6 @@ const fastify = require('fastify')({
const stringify = require('fast-json-stable-stringify')
const { Telegraf } = require('telegraf')
const Ohbem = require('ohbem')
const path = require('path')
const chokidar = require('chokidar')
const moment = require('moment-timezone')
const geoTz = require('geo-tz')
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/controller.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const inside = require('point-in-polygon')
const EventEmitter = require('events')
const path = require('path')
const fs = require('fs')
const inside = require('point-in-polygon')
const Uicons = require('../lib/uicons')
const TileserverPregen = require('../lib/tileserverPregen')
const replaceAsync = require('../util/stringReplaceAsync')
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/query.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const cp = require('child_process')
const inside = require('point-in-polygon')
const NodeGeocoder = require('node-geocoder')
const cp = require('child_process')
const TileserverPregen = require('../lib/tileserverPregen')

class Query {
Expand Down
18 changes: 13 additions & 5 deletions src/controllers/weather.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const path = require('path')
const moment = require('moment-timezone')
const axios = require('axios')
const { S2 } = require('s2-geometry')
const S2ts = require('nodes2ts')
const path = require('path')
const pcache = require('flat-cache')
const { Mutex } = require('async-mutex')
require('moment-precise-range-plugin')
Expand Down Expand Up @@ -176,10 +176,14 @@ class Weather extends Controller {
if (apiKeyWeatherLocation) {
try {
// Fetch location information
const url = `https://dataservice.accuweather.com/locations/v1/cities/geoposition/search?apikey=${apiKeyWeatherLocation}&q=${latlng.lat}%2C${latlng.lng}`
const url = `https://dataservice.accuweather.com/locations/v1/cities/geoposition/search?q=${latlng.lat}%2C${latlng.lng}`
this.log.debug(`${id}: Fetching AccuWeather location ${url}`)

const weatherLocation = await axios.get(url)
const weatherLocation = await axios.get(url, {
headers: {
Authorization: `Bearer ${apiKeyWeatherLocation}`,
},
})
data.location = weatherLocation.data.Key
} catch (err) {
this.log.error(`${id}: Fetching AccuWeather location errored with: ${err}`)
Expand Down Expand Up @@ -209,11 +213,15 @@ class Weather extends Controller {
if (apiKeyWeatherInfo) {
try {
// Fetch new weather information
const url = `https://dataservice.accuweather.com/forecasts/v1/hourly/12hour/${data.location}?apikey=${apiKeyWeatherInfo}&details=true&metric=true`
const url = `https://dataservice.accuweather.com/forecasts/v1/hourly/12hour/${data.location}?details=true&metric=true`
this.log.debug(`${id}: Fetching AccuWeather Forecast ${url}`)

let logString = ''
const weatherInfo = await axios.get(url)
const weatherInfo = await axios.get(url, {
headers: {
Authorization: `Bearer ${apiKeyWeatherInfo}`,
},
})
for (const forecast in Object.entries(weatherInfo.data)) {
if (weatherInfo.data[forecast].EpochDateTime > currentHourTimestamp) {
const pogoWeather = this.mapPoGoWeather(weatherInfo.data[forecast])
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/weatherData.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const { S2 } = require('s2-geometry')
const EventEmitter = require('events')

const path = require('path')
const { S2 } = require('s2-geometry')
const pcache = require('flat-cache')

const weatherCache = pcache.load('weatherCache', path.join(__dirname, '../../.cache'))
Expand Down
4 changes: 2 additions & 2 deletions src/init/initConfig.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const config = require('config')
const path = require('path')
const reader = require('readline-sync')
const fs = require('fs')
const config = require('config')
const reader = require('readline-sync')
const { log } = require('../lib/logger')

const discordRe = /[ODMN][A-Za-z\d]{23}\.[\w-]{6}\.[\w-]{27}/g
Expand Down
2 changes: 1 addition & 1 deletion src/init/migrateV3.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const path = require('path')
const Knex = require('knex')
const config = require('config')
const path = require('path')
const reader = require('readline-sync')
const { log } = require('../lib/logger')
const Daptcha = require('./daptcha')
Expand Down
4 changes: 2 additions & 2 deletions src/lib/cachingGeocoder.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/* eslint-disable max-classes-per-file */
const { performance } = require('perf_hooks')
const path = require('path')
const NodeGeocoder = require('node-geocoder')
const pcache = require('flat-cache')
const { performance } = require('perf_hooks')
const emojiFlags = require('country-code-emoji')
const path = require('path')
const NominatimGeocoder = require('./nominatimGeocoder')

class NominatimGeocoderConverter extends NominatimGeocoder {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/discord/commando/commands/autocreate.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const stripJsonComments = require('strip-json-comments')
const fs = require('fs')
const path = require('path')
const stripJsonComments = require('strip-json-comments')
const { Permissions } = require('discord.js')
const PoracleDiscordMessage = require('../../poracleDiscordMessage')
const PoracleDiscordState = require('../../poracleDiscordState')
Expand Down
4 changes: 2 additions & 2 deletions src/lib/discord/commando/index.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const { EventEmitter } = require('events')
const fs = require('fs')
const {
Client,
Intents,
Options,
} = require('discord.js')
const { EventEmitter } = require('events')
const fs = require('fs')
const { S2 } = require('s2-geometry')
const mustache = require('handlebars')
const hastebin = require('hastebin-gen')
Expand Down
2 changes: 1 addition & 1 deletion src/lib/dtsloader.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const stripJsonComments = require('strip-json-comments')
const path = require('path')
const fs = require('fs')
const stripJsonComments = require('strip-json-comments')

function readDtsFiles() {
let localDts = []
Expand Down
2 changes: 1 addition & 1 deletion src/lib/geofenceLoader.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const stripJsonComments = require('strip-json-comments')
const fs = require('fs')
const path = require('path')
const stripJsonComments = require('strip-json-comments')
const RBush = require('rbush')
const { log } = require('./logger')

Expand Down
2 changes: 1 addition & 1 deletion src/lib/partials.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const stripJsonComments = require('strip-json-comments')
const fs = require('fs')
const path = require('path')
const stripJsonComments = require('strip-json-comments')

function registerPartials(handlebars) {
const filename = path.join(__dirname, '../../config/partials.json')
Expand Down
2 changes: 1 addition & 1 deletion src/lib/poracleMessage/commands/broadcast.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const stripJsonComments = require('strip-json-comments')
const fs = require('fs')
const path = require('path')
const stripJsonComments = require('strip-json-comments')

exports.run = async (client, msg, args, options) => {
try {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/poracleMessage/commands/poracle-test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const stripJsonComments = require('strip-json-comments')
const fs = require('fs')
const path = require('path')
const stripJsonComments = require('strip-json-comments')
const geoTz = require('geo-tz')
const moment = require('moment-timezone')

Expand Down
2 changes: 1 addition & 1 deletion src/lib/telegram/Telegram.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
const { EventEmitter } = require('events')
const fs = require('fs')
const fsp = require('fs').promises
const { performance } = require('perf_hooks')
const NodeCache = require('node-cache')
const mustache = require('handlebars')
const { performance } = require('perf_hooks')
const emojiStrip = require('../../util/emojiStrip')
const FairPromiseQueue = require('../FairPromiseQueue')

Expand Down
123 changes: 123 additions & 0 deletions src/routes/apiHumans.js
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,52 @@ module.exports = async (fastify, options) => {
}
})

fastify.post('/api/humans/:id/adminDisabled', options, async (req) => {
fastify.logger.info(`API: ${req.ip} ${req.routeOptions.method} ${req.routeOptions.url}`)

if (fastify.config.server.ipWhitelist.length && !fastify.config.server.ipWhitelist.includes(req.ip)) return { webserver: 'unhappy', reason: `ip ${req.ip} not in whitelist` }
if (fastify.config.server.ipBlacklist.length && fastify.config.server.ipBlacklist.includes(req.ip)) return { webserver: 'unhappy', reason: `ip ${req.ip} in blacklist` }

const secret = req.headers['x-poracle-secret']
if (!secret || !fastify.config.server.apiSecret || secret !== fastify.config.server.apiSecret) {
return { status: 'authError', reason: 'incorrect or missing api secret' }
}

const human = await fastify.query.selectOneQuery('humans', { id: req.params.id })

if (!human) {
return {
status: 'error',
message: 'User not found',
}
}

// Validate the state parameter
if (req.body.state === undefined || req.body.state === null) {
return {
status: 'error',
message: 'Missing required field: state',
}
}

const adminDisabledState = req.body.state ? 1 : 0
const disabledDate = adminDisabledState === 1 ? fastify.query.dbNow() : null

await fastify.query.updateQuery(
'humans',
{
admin_disable: adminDisabledState,
disabled_date: disabledDate,
},
{ id: req.params.id },
)

return {
status: 'ok',
admin_disabled: adminDisabledState,
}
})

fastify.get('/api/humans/one/:id', options, async (req) => {
fastify.logger.info(`API: ${req.ip} ${req.routeOptions.method} ${req.routeOptions.url}`)

Expand All @@ -536,4 +582,81 @@ module.exports = async (fastify, options) => {
human,
}
})

fastify.post('/api/humans', options, async (req) => {
fastify.logger.info(`API: ${req.ip} ${req.routeOptions.method} ${req.routeOptions.url}`)

if (fastify.config.server.ipWhitelist.length && !fastify.config.server.ipWhitelist.includes(req.ip)) return { webserver: 'unhappy', reason: `ip ${req.ip} not in whitelist` }
if (fastify.config.server.ipBlacklist.length && fastify.config.server.ipBlacklist.includes(req.ip)) return { webserver: 'unhappy', reason: `ip ${req.ip} in blacklist` }

const secret = req.headers['x-poracle-secret']
if (!secret || !fastify.config.server.apiSecret || secret !== fastify.config.server.apiSecret) {
return { status: 'authError', reason: 'incorrect or missing api secret' }
}

// Validate required fields
if (!req.body.id || !req.body.name) {
return {
status: 'error',
message: 'Missing required fields: id and name are required',
}
}

// Check if user already exists
const existingUser = await fastify.query.selectOneQuery('humans', { id: req.body.id })

if (existingUser) {
return {
status: 'error',
message: 'User already exists',
}
}

// Create new user
const newUser = {
id: req.body.id,
type: req.body.type || 'discord:user',
name: req.body.name,
enabled: req.body.enabled || 1,
area: req.body.area || '[]',
latitude: req.body.latitude || 0.0,
longitude: req.body.longitude || 0.0,
admin_disable: req.body.admin_disable || 0,
language: req.body.language || 'en',
community_membership: '[]',
area_restriction: null,
notes: req.body.notes || '',
}

// Handle community membership
if (req.body.community) {
newUser.community_membership = JSON.stringify([req.body.community.toLowerCase()])
newUser.area_restriction = JSON.stringify(communityLogic.calculateLocationRestrictions(fastify.config, [req.body.community]))
}

await fastify.query.insertQuery('humans', newUser)

// Handle profile creation if profile_name is provided
if (req.body.profile_name && req.body.profile_name !== '') {
const existingProfile = await fastify.query.selectOneQuery('profiles', { id: req.body.id, profile_no: 1 })

if (!existingProfile) {
await fastify.query.insertQuery('profiles', {
id: req.body.id,
profile_no: 1,
name: req.body.profile_name,
area: '[]',
latitude: 0.0,
longitude: 0.0,
active_hours: '[]',
})
}
}

return {
status: 'ok',
message: 'User created successfully',
human: newUser,
}
})
}
2 changes: 1 addition & 1 deletion src/routes/apiTracking.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ module.exports = async (fastify, options) => {
message: 'User not found',
}
}
const currentProfileNo = human.current_profile_no
const currentProfileNo = req.query.profile_no || human.current_profile_no
const { id } = req.params

const pokemon = await fastify.query.selectAllQuery('monsters', { id, profile_no: currentProfileNo })
Expand Down
Loading