Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
2a9cbbf
fix: battle/raid filtering race condition
Mygod Dec 9, 2025
cd01a92
fix: ground raid/battle icons
Mygod Dec 9, 2025
3717c2e
chore: centralize overlay logic
Mygod Dec 9, 2025
21b50f5
fix: weather icon in pokemon background popup
Mygod Dec 10, 2025
640c5ad
chore(release): v1.40.2-develop.1 [skip ci]
semantic-release-bot Dec 10, 2025
4f5aace
feat: support stationed pokemon extras
Mygod Dec 10, 2025
907ca33
fix: no scrollbars plz
Mygod Dec 11, 2025
8a0447c
feat: dynamic placed Pokemon dropdown height
Mygod Dec 11, 2025
497f350
fix: battle/raid icon max height
Mygod Dec 11, 2025
b2ea525
chore(release): v1.41.0-develop.1 [skip ci]
semantic-release-bot Dec 11, 2025
0f157ed
fix: remove extra Forms
Mygod Dec 11, 2025
e46ea5b
chore(release): v1.41.0-develop.2 [skip ci]
semantic-release-bot Dec 15, 2025
a2c7f17
fix: logic bug in loading non-clustered elements (#1161)
ComplementaryPogo Dec 15, 2025
bce4be5
chore: sync config [skip ci]
turtlesocks-bot Dec 15, 2025
d3ea283
feat: default clientPrompt to none to skip permission reapproval
Mygod Dec 16, 2025
d7ecbde
chore: sync config [skip ci]
turtlesocks-bot Dec 16, 2025
b579ded
fix: more robust discord handling (#1181)
Mygod Dec 16, 2025
11c75e0
chore(release): v1.41.0-develop.3 [skip ci]
semantic-release-bot Dec 16, 2025
cea3141
fix: area reload
Mygod Dec 31, 2025
5c907c5
chore(release): v1.41.0-develop.4 [skip ci]
semantic-release-bot Dec 31, 2025
7bd5ce1
fix: escape gpx xml (#1186)
josh-vin Jan 8, 2026
5b32067
chore(release): v1.41.0-develop.5 [skip ci]
semantic-release-bot Jan 8, 2026
8adba28
feat: ar/no-ar quest dot badge
Mygod Feb 16, 2026
b626d3d
fix: showcase icons display
Mygod Feb 16, 2026
4b73e0e
chore: sync config [skip ci]
turtlesocks-bot Feb 16, 2026
d418fed
chore(deps): bump lodash-es from 4.17.21 to 4.17.23 (#1188)
dependabot[bot] Feb 16, 2026
f9f05d9
chore(deps): bump @apollo/server from 4.11.0 to 5.4.0 (#1190)
dependabot[bot] Feb 16, 2026
6b9eb0c
chore(deps): bump lodash from 4.17.21 to 4.17.23 (#1189)
dependabot[bot] Feb 16, 2026
ce37e2a
fix: im dumdum
Mygod Feb 16, 2026
a106233
chore(release): v1.41.0-develop.6 [skip ci]
semantic-release-bot Feb 16, 2026
3907656
fix: properly migrate to express 5
Mygod Feb 17, 2026
55ba38a
chore(release): v1.41.0-develop.7 [skip ci]
semantic-release-bot Feb 17, 2026
018ba93
fix: hidden power in raids are fighting type
Mygod Feb 18, 2026
12f0012
chore(release): v1.41.0-develop.8 [skip ci]
semantic-release-bot Feb 18, 2026
ee176da
fix: pokemon onlyManualId filter in expert sql mode
Mygod Feb 19, 2026
dfda729
chore(release): v1.41.0-develop.9 [skip ci]
semantic-release-bot Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,94 @@
# [1.41.0-develop.9](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.8...v1.41.0-develop.9) (2026-02-19)


### Bug Fixes

* pokemon onlyManualId filter in expert sql mode ([ee176da](https://github.com/WatWowMap/ReactMap/commit/ee176da3749c27b33aa659ba432706ad5c19951b))

# [1.41.0-develop.8](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.7...v1.41.0-develop.8) (2026-02-18)


### Bug Fixes

* hidden power in raids are fighting type ([018ba93](https://github.com/WatWowMap/ReactMap/commit/018ba93642eee0a08d2a864c1a04998ff63503a9))

# [1.41.0-develop.7](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.6...v1.41.0-develop.7) (2026-02-17)


### Bug Fixes

* properly migrate to express 5 ([3907656](https://github.com/WatWowMap/ReactMap/commit/390765696dbdcd89ed2fd57b16d41ecc2725a1b9))

# [1.41.0-develop.6](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.5...v1.41.0-develop.6) (2026-02-16)


### Bug Fixes

* im dumdum ([ce37e2a](https://github.com/WatWowMap/ReactMap/commit/ce37e2a9123ea2808cde3f3f130361055141ae63))
* showcase icons display ([b626d3d](https://github.com/WatWowMap/ReactMap/commit/b626d3d37c18b5ef6261f02b105796fdb8ce011f))


### Features

* ar/no-ar quest dot badge ([8adba28](https://github.com/WatWowMap/ReactMap/commit/8adba286fea81d194e0dd4b7da5c680f6499b697))

# [1.41.0-develop.5](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.4...v1.41.0-develop.5) (2026-01-08)


### Bug Fixes

* escape gpx xml ([#1186](https://github.com/WatWowMap/ReactMap/issues/1186)) ([7bd5ce1](https://github.com/WatWowMap/ReactMap/commit/7bd5ce10d3e8aa6f64faac8d3d9773c589d6a28e))

# [1.41.0-develop.4](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.3...v1.41.0-develop.4) (2025-12-31)


### Bug Fixes

* area reload ([cea3141](https://github.com/WatWowMap/ReactMap/commit/cea3141386d804f502e83e89b9bf92da93102a5d))

# [1.41.0-develop.3](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.2...v1.41.0-develop.3) (2025-12-16)


### Bug Fixes

* logic bug in loading non-clustered elements ([#1161](https://github.com/WatWowMap/ReactMap/issues/1161)) ([a2c7f17](https://github.com/WatWowMap/ReactMap/commit/a2c7f17e02ff7cd5467d4bf5ccd8b13a444ba725))
* more robust discord handling ([#1181](https://github.com/WatWowMap/ReactMap/issues/1181)) ([b579ded](https://github.com/WatWowMap/ReactMap/commit/b579dedeb196fb4d8b1da025e325049bfd7833e8))


### Features

* default clientPrompt to none to skip permission reapproval ([d3ea283](https://github.com/WatWowMap/ReactMap/commit/d3ea283b5eacda18b9f4725e50e5353a955a363d))

# [1.41.0-develop.2](https://github.com/WatWowMap/ReactMap/compare/v1.41.0-develop.1...v1.41.0-develop.2) (2025-12-15)


### Bug Fixes

* remove extra Forms ([0f157ed](https://github.com/WatWowMap/ReactMap/commit/0f157edba37eb727fdb9f4a5b96bdf417298cdfc))

# [1.41.0-develop.1](https://github.com/WatWowMap/ReactMap/compare/v1.40.2-develop.1...v1.41.0-develop.1) (2025-12-11)


### Bug Fixes

* battle/raid icon max height ([497f350](https://github.com/WatWowMap/ReactMap/commit/497f3504a4ea6000184c9df30c5a3c3e76d65d80))
* no scrollbars plz ([907ca33](https://github.com/WatWowMap/ReactMap/commit/907ca331beb1fe81dd671732d5ebe1980d8d6faa))


### Features

* dynamic placed Pokemon dropdown height ([8a0447c](https://github.com/WatWowMap/ReactMap/commit/8a0447c3e9d7df9c4aa9add657a234a1bc59b412))
* support stationed pokemon extras ([4f5aace](https://github.com/WatWowMap/ReactMap/commit/4f5aace285285d55e3a946fb2f465b7609a9caea))

## [1.40.2-develop.1](https://github.com/WatWowMap/ReactMap/compare/v1.40.1...v1.40.2-develop.1) (2025-12-10)


### Bug Fixes

* battle/raid filtering race condition ([2a9cbbf](https://github.com/WatWowMap/ReactMap/commit/2a9cbbf180313064830a524f86eae62f41b6b87b))
* ground raid/battle icons ([cd01a92](https://github.com/WatWowMap/ReactMap/commit/cd01a92bda81f786ca2c14f10df8cc4489163fd6))
* weather icon in pokemon background popup ([21b50f5](https://github.com/WatWowMap/ReactMap/commit/21b50f51b81bf6f7723753a4f77289ead99c51e7))

## [1.40.1](https://github.com/WatWowMap/ReactMap/compare/v1.40.0...v1.40.1) (2025-12-09)


Expand Down
8 changes: 8 additions & 0 deletions config/custom-environment-variables.json
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,14 @@
"__name": "CLIENT_SIDE_OPTIONS_POKESTOPS_HAS_QUEST_INDICATOR",
"__format": "boolean"
},
"showArQuestDotBadge": {
"__name": "CLIENT_SIDE_OPTIONS_POKESTOPS_SHOW_AR_QUEST_DOT_BADGE",
"__format": "boolean"
},
"showNoArQuestDotBadge": {
"__name": "CLIENT_SIDE_OPTIONS_POKESTOPS_SHOW_NO_AR_QUEST_DOT_BADGE",
"__format": "boolean"
},
"showArBadge": {
"__name": "CLIENT_SIDE_OPTIONS_POKESTOPS_SHOW_AR_BADGE",
"__format": "boolean"
Expand Down
4 changes: 3 additions & 1 deletion config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,8 @@
"customRange": 0,
"madQuestText": false,
"hasQuestIndicator": true,
"showArQuestDotBadge": false,
"showNoArQuestDotBadge": true,
"showArBadge": false,
"enablePokestopPopupCoords": false,
"invasionOpacity": true,
Expand Down Expand Up @@ -719,7 +721,7 @@
"allowedGuilds": [],
"blockedGuilds": [],
"allowedUsers": [],
"clientPrompt": "consent",
"clientPrompt": "none",
"thumbnailUrl": "https://user-images.githubusercontent.com/58572875/167069223-745a139d-f485-45e3-a25c-93ec4d09779c.png",
"trialPeriod": {
"start": {
Expand Down
11 changes: 6 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "reactmap",
"version": "1.40.1",
"version": "1.41.0-develop.9",
"private": true,
"description": "React based frontend map.",
"license": "MIT",
Expand Down Expand Up @@ -99,7 +99,8 @@
},
"dependencies": {
"@apollo/client": "3.11.4",
"@apollo/server": "4.11.0",
"@apollo/server": "5.4.0",
"@as-integrations/express5": "1.1.2",
"@emotion/react": "11.14.0",
"@emotion/styled": "11.13.0",
"@graphql-tools/graphql-file-loader": "8.0.1",
Expand Down Expand Up @@ -140,7 +141,7 @@
"express-rate-limit": "7.4.0",
"express-session": "^1.18.1",
"geo-tz": "^7.0.7",
"graphql": "16.9.0",
"graphql": "16.11.0",
"graphql-type-json": "0.3.2",
"helmet": "7.1.0",
"i18next": "23.12.3",
Expand All @@ -151,7 +152,7 @@
"leaflet": "1.9.4",
"leaflet-arrowheads": "^1.4.0",
"leaflet.locatecontrol": "0.85.1",
"lodash": "^4.17.21",
"lodash": "^4.17.23",
"long": "^4.0.0",
"moment-timezone": "^0.6.0",
"mysql2": "3.11.0",
Expand Down Expand Up @@ -219,7 +220,7 @@
"tmp": ">=0.2.4"
},
"engines": {
"node": ">=18",
"node": ">=20",
"yarn": "^1.22.x"
}
}
2 changes: 1 addition & 1 deletion packages/config/.configref
Original file line number Diff line number Diff line change
@@ -1 +1 @@
26702
26772
2 changes: 2 additions & 0 deletions packages/locales/lib/human/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,8 @@
"webhook_selection": "{{name}} Selection",
"message_of_the_day": "Message of the Day",
"has_quest_indicator": "Alternative Color for Stops with Quests",
"show_ar_quest_dot_badge": "Show AR Quest Dot Badge",
"show_no_ar_quest_dot_badge": "Show No-AR Quest Dot Badge",
"show_ar_badge": "Show AR Badge",
"all_gyms": "All Gyms",
"general": "General",
Expand Down
5 changes: 1 addition & 4 deletions packages/types/lib/scanner.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -372,11 +372,8 @@ export interface Route {

export type FullRoute = FullModel<Route, RouteModel.Route>

export interface StationPokemon {
export interface StationPokemon extends PokemonDisplay {
pokemon_id: number
form: number
costume: number
gender: number
bread_mode: number
}

Expand Down
6 changes: 6 additions & 0 deletions server/src/graphql/typeDefs/scanner.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -323,5 +323,11 @@ type StationPokemon {
form: Int
costume: Int
gender: Int
shiny: Boolean
temp_evolution: Int
temp_evolution_finish_ms: Float
alignment: Int
badge: Int
background: Int
bread_mode: Int
}
2 changes: 1 addition & 1 deletion server/src/middleware/apollo.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// @ts-check
const { expressMiddleware } = require('@apollo/server/express4')
const { expressMiddleware } = require('@as-integrations/express5')
const { ApolloServerErrorCode } = require('@apollo/server/errors')
const { GraphQLError } = require('graphql')
const { parse } = require('graphql')
Expand Down
34 changes: 17 additions & 17 deletions server/src/models/Pokemon.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ class Pokemon extends Model {
const selectColumns = [
'*',
hasSize && !hasHeight ? 'size AS height' : 'size',
ref('pokemon.id').castTo('CHAR').as('id'),
]
if (hasPokemonBackground) {
selectColumns.push('background')
Expand All @@ -198,18 +199,22 @@ class Pokemon extends Model {
'>=',
isMad ? this.knex().fn.now() : ts,
)
const manualIdColumn = isMad ? 'pokemon.encounter_id' : 'id'
manualId = applyManualIdFilter(query, {
manualId: manualIdFilter,
latColumn: isMad ? 'pokemon.latitude' : 'lat',
lonColumn: isMad ? 'pokemon.longitude' : 'lon',
idColumn: isMad ? 'pokemon.encounter_id' : 'id',
idColumn: manualIdColumn,
bounds: {
minLat: args.minLat,
maxLat: args.maxLat,
minLon: args.minLon,
maxLon: args.maxLon,
},
})
if (manualId !== null) {
query.orderByRaw('?? = ? DESC', [manualIdColumn, manualId])
}
query.andWhere((ivOr) => {
if (ivs || pvp) {
if (globalFilter.filterKeys.size) {
Expand Down Expand Up @@ -710,24 +715,19 @@ class Pokemon extends Model {
if (!noPokemonSelect) return []
}

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,
])
const query = this.query().where(
isMad ? 'disappear_time' : 'expire_timestamp',
'>=',
isMad ? this.knex().fn.now() : ts,
)
if (isMad) {
Pokemon.getMadSql(query)
} else {
query.select(['*', hasSize && !hasHeight ? 'size AS height' : 'size'])
query.select([
'*',
hasSize && !hasHeight ? 'size AS height' : 'size',
ref('id').castTo('CHAR').as('id'),
])
}
if (
!getAreaSql(
Expand Down Expand Up @@ -970,7 +970,7 @@ class Pokemon extends Model {
])
} else {
query.select([
'id',
ref('id').castTo('CHAR').as('id'),
'lat',
'lon',
'form',
Expand Down
31 changes: 22 additions & 9 deletions server/src/services/DiscordClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,23 +87,36 @@ class DiscordClient extends AuthClient {
this.client.login(this.strategy.botToken)
}

/** @param {string} guildId @param {string} userId */
/**
* @param {string} guildId
* @param {string} userId
* @returns {Promise<string[]>}
*/
async getUserRoles(guildId, userId) {
try {
const members = await this.client.guilds.cache
.get(guildId)
?.members.fetch()
if (members) {
const member = members.get(userId)
return member?.roles.cache.map((role) => role.id) || []
}
return []
const guild =
this.client.guilds.cache.get(guildId) ||
(await this.client.guilds.fetch(guildId))
const member = await guild?.members.fetch(userId)
return member?.roles.cache.map((role) => role.id) || []
} catch (e) {
const code =
e && typeof e === 'object' && 'code' in e ? Number(e.code) : null
if (code === 10007) {
this.log.debug(
'Discord member not found in guild',
guildId,
'for user',
userId,
)
return []
}
this.log.error(
'Failed to get roles in guild',
guildId,
'for user',
userId,
e,
)
}
return []
Expand Down
10 changes: 10 additions & 0 deletions server/src/ui/clientOptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,16 @@ function clientOptions(perms) {
perm: ['quests'],
category: 'markers',
},
showArQuestDotBadge: {
type: 'bool',
perm: ['quests'],
category: 'markers',
},
showNoArQuestDotBadge: {
type: 'bool',
perm: ['quests'],
category: 'markers',
},
showArBadge: { type: 'bool', perm: ['pokestops'], category: 'markers' },
invasionOpacity: {
type: 'bool',
Expand Down
8 changes: 5 additions & 3 deletions server/src/utils/reloadConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const { log, TAGS } = require('@rm/logger')

const { state } = require('../services/state')
const { bindConnections } = require('../models')
const { loadLatestAreas } = require('../services/areas')
const { loadCachedAreas, loadLatestAreas } = require('../services/areas')
const { loadAuthStrategies } = require('../routes/authRouter')
const { deepCompare } = require('./deepCompare')

Expand Down Expand Up @@ -52,6 +52,10 @@ async function reloadConfig() {
const newConfig = require('@rm/config')

const { areas, ...oldWithoutAreas } = oldConfig
const primedAreas = areas || loadCachedAreas()
// Prime areas early so config.getSafe('areas') never fails during reload.
newConfig.setAreas(primedAreas)
oldWithoutAreas.areas = primedAreas

const { report, areEqual, changed } = deepCompare(
oldWithoutAreas,
Expand All @@ -69,8 +73,6 @@ async function reloadConfig() {
!report.manualAreas.areEqual
) {
newConfig.setAreas(await loadLatestAreas())
} else {
newConfig.setAreas(areas)
}

if (areEqual) {
Expand Down
Loading