merefield
(Robert)
31. Januar 2026 um 19:06
1213
Wenn Sie bezahlen, ja
Dies ist ein unabhĂ€ngiges Plugin, der Support ist nicht kostenlos und ich gebe keine Garantien â Sie verwenden es auf eigenes Risiko.
Ich hÀtte das auch einfach nirgendwo teilen können.
3 âGefĂ€llt mirâ
merefield
(Robert)
31. Januar 2026 um 21:04
1214
Dies ist nun zusammengefĂŒhrt, nochmals vielen Dank an die Sponsoren @ç„ćäŒ und @nathank
main â automated_ip_based_user_location_determination
merged 09:02PM - 31 Jan 26 UTC
## IPâbased User Location (MaxMind â GeoNames)
### What this adds
- Auto⊠matically determines a userâs location from their IP after post creation.
- Uses **MaxMind (DiscourseIpInfo)** for identity + GeoNames for canonical lat/lon.
- Stores exactly **one granularity level** per user (`country` / `province` / `city`) in `UserCustomField`
`geo_location`.
- Ensures lat/lon match the chosen granularity (privacyâcorrect coordinates).
- Caches GeoNames lookups by `geoname_id` (no extra gems; uses `FinalDestination::HTTP`).
---
## Prerequisites (official accounts)
You must have valid accounts and credentials from:
- **MaxMind GeoLite2**
Sign up and obtain an Account ID + License Key:
https://www.maxmind.com/en/geolite2/signup
- **GeoNames**
Create a username for the GeoNames API and **enable Web Services** in your GeoNames account settings:
https://www.geonames.org/login
---
## Required Configuration
**Env vars (MaxMind) for `app.yml`**
- `DISCOURSE_MAXMIND_ACCOUNT_ID`
- `DISCOURSE_MAXMIND_LICENSE_KEY`
**Site settings**
- `location_geonames_username` (GeoNames username)
**Dev note (MaxMind DBs)**
- In development, ensure the MaxMind DBs are downloaded:
DISCOURSE_MAXMIND_ACCOUNT_ID=... DISCOURSE_MAXMIND_LICENSE_KEY=... bundle exec rake maxminddb:get
Restart web/sidekiq afterward so `DiscourseIpInfo` reloads the DBs.
---
## Settings
| Setting | Default | Description |
|---|---:|---|
| `location_ip_granularity` | `city` | Controls stored level: `country`, `province` (admin1), `county` (admin2), or `city`. |
| `location_geonames_username` | `""` | GeoNames username for `getJSON` requests. Acts as a feature flag (blank => skip). |
| `location_ip_lookup_cooldown_days` | `1` | Perâuser cooldown between IP lookups (0 disables cooldown). |
| `locations_skip_ip_based_location_update_if_existing` | `true` | Skip IP lookup when existing `geo_location` already has **lat + lon**. |
| `location_ip_auto_lookup_enabled` | `false` | Autoâenqueue IP lookups on post creation. Rake task still works when off. |
---
## Flow
- `post_created` â enqueue `Jobs::Locations::IpLocationLookup` with user ID + IP.
- Job:
- Guards: plugin enabled, users map enabled, GeoNames username present, MaxMind env vars present, cooldown
OK, and optional âexisting locationâ check.
- Uses `DiscourseIpInfo.get(ip)` to get `geoname_ids`.
- Resolves GeoNames IDs, picks feature by granularity (`country` / `province` / `county` / `city`), builds
`geo_location`.
- Saves `geo_location` to user custom field + updates `locations_user` table.
---
## Job + Hook
**Hook**
- `post_created` now enqueues `Jobs::Locations::IpLocationLookup`
- In development, IP is overridden to a fixed test IP (`2.139.231.7`) to ensure resolvable data.
**Job**
- `Jobs::Locations::IpLocationLookup` (new, in `app/jobs/regular/locations/ip_location_lookup.rb`)
- Logs key steps, skips when prerequisites are missing.
- Writes `geo_location` only when successfully built.
---
## GeoNames Helpers
New modules in `lib/locations/`:
- `GeoNamesClient`
- Calls `https://secure.geonames.org/getJSON` via `FinalDestination::HTTP`.
- Normalizes `geoname_id`, `fcl`, `fcode`, `lat`, `lon`, etc.
- Caches only successful lookups (avoids caching nil).
- `GeoNamesGranularityPicker`
- Selects best `PCLI` / `ADM1` / `PPL*` by desired granularity.
- `GeoLocationBuilder`
- Builds `geo_location` hash with correct `lat/lon`, `state`/`city` based on granularity.
---
## Rake Task
New rake task in `lib/tasks/locations.rake`:
**Task**
rake locations:enqueue_user_ip_location_lookups[username_pattern,pattern_type,delay]
**Behavior**
- Iterates users and enqueues the IP lookup job using `user.ip_address`.
- Progress is based on **matched population** (not total users).
- Skips enqueue when IP is blank.
**Options**
- `username_pattern` (optional): filter users by username.
- `pattern_type`: `string` (default substring match) or `regex`.
- `delay`: seconds between enqueues (float, default `0`).
**Help**
rake locations:enqueue_user_ip_location_lookups:help
Umfangreiche Details in der PR.
@Roi Ich bemerke, dass Sie nicht fĂŒr Support bezahlen â ich glaube jedoch, dass ich den Code in dieser PR möglicherweise verbessert habe. Bitte versuchen Sie das von mir veröffentlichte Skript erneut. Wenn Sie möchten, dass ich es mir genauer ansehe, können Sie mich beauftragen.
4 âGefĂ€llt mirâ
Roi
31. Januar 2026 um 22:11
1215
@merefield noch nicht.
Ich habe gerade ĂŒberprĂŒft, der fehlerhafte Eintrag blieb auch bei der neuen Version bestehen.
Da es aber nur ein Benutzer war, habe ich manuell geprĂŒft und er hatte eine Stadt im ânormalenâ Ortsfeld und ich habe das Ortsfeld mit diesen Informationen neu erstellt. Jetzt ist die Abfrage leer.
2 âGefĂ€llt mirâ
Quacken
1. Februar 2026 um 15:10
1216
Hallo, ich habe woanders einen Fehlerbericht gepostet und wurde gebeten, ihn in diesem Thema erneut zu posten.
Es stellt sich heraus, dass das Navigieren zu einer Kategorie, fĂŒr die Standorte aktiviert und die Standardansicht auf die Karte eingestellt ist, zu einem Absturz fĂŒhrt.
Hier sind einige Screenshots (entschuldigen Sie die Lokalisierung, die Wörter bedeuten âErscheinungsbild: Standard-Themenliste: Hot, Neueste, Top, Karteâ):
Es scheint, dass das Plugin auf siteSettings zugreift und davon ausgeht, dass es definiert ist, obwohl dies nicht der Fall ist.
UrsprĂŒnglicher Fehlerbericht:
Support
Discourse Locations
Environment Discourse Version: v2026.2.0-latest +15 Plugin Commit: c1547ead Steps to Reproduce When using Locations plugin if I check Allow locations to be added to topics in this category and then try to set the map tab as the default view for...
Reading time: 1 mins đ
Likes: 1 â€
1 âGefĂ€llt mirâ
merefield
(Robert)
1. Februar 2026 um 15:25
1217
Danke, wenn dies wichtig genug fĂŒr Sie ist, können Sie mich einstellen, um es zu beheben. PR willkommen.
1 âGefĂ€llt mirâ