diff options
| author | Craig Jennings <c@cjennings.net> | 2026-04-22 00:07:51 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-04-22 00:07:51 -0500 |
| commit | 9958ec4c4396ae8435f7e1818ff383c05df47a14 (patch) | |
| tree | 9835229246368cca582f669837cd2859a79c8862 /README.org | |
| parent | 603f70d78f771c0a14c7f312aee6da68060b5d8b (diff) | |
| download | emacs-wttrin-9958ec4c4396ae8435f7e1818ff383c05df47a14.tar.gz emacs-wttrin-9958ec4c4396ae8435f7e1818ff383c05df47a14.zip | |
feat: add IP geolocation command for setting wttrin-favorite-location
Lets users set `wttrin-favorite-location` by IP lookup instead of typing a city by hand. `M-x wttrin-set-location-from-geolocation` runs the lookup, shows the detected "City, Region" in a yes/no prompt, and on confirmation sets the variable for the session. The docstring points at `M-x customize-save-variable` for persistence across restarts.
The new `wttrin-geolocation.el` module provides the provider layer. Three providers come built in: ipapi.co (the default), ipinfo.io, and ipwho.is. All three are HTTPS, need no API key, and have free tiers large enough for interactive use. The module has three layers. Pure JSON parsers handle the per-provider quirks: ipapi's `error: true` flag, ipwho.is's `success: false` flag, ipinfo's HTTP-status-only signalling. A small fetch helper extracts the HTTP body. `wttrin-geolocation-detect` wires them together and calls back with "City, Region" on success, or nil on any failure (network error, HTTP 4xx or 5xx, malformed response, rate-limit signal).
Providers live in an alist keyed by symbol, with plist values for :name, :url, and :parser. To use a different provider, push an entry onto `wttrin-geolocation--providers` and select it via `wttrin-geolocation-provider`. No code change needed.
README gains a subsection under Mode-line Weather Display covering the command, how to persist the result, provider selection with free-tier limits, and the accuracy caveat for VPN or mobile-hotspot users.
39 new tests across the parser layer (10 ipapi, 6 ipinfo, 6 ipwhois), fetch-and-dispatch (11), and interactive command (6). Each suite covers Normal, Boundary, and Error categories. Tests mock `url-retrieve` and `yes-or-no-p` at their boundaries and run the real extract-and-parse pipeline underneath. Test suite: 333 → 373 passing.
Diffstat (limited to 'README.org')
| -rw-r--r-- | README.org | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -233,6 +233,25 @@ If a refresh fails, the emoji dims to gray and the tooltip tells you what went w *Note:* If the weather emoji appears as a monochrome symbol instead of a color icon, try setting `wttrin-mode-line-emoji-font` to match a color emoji font installed on your system. Use `M-x fc-list` or check your system fonts to see what's available. +*** Setting the Favorite Location from IP Geolocation +If you don't want to type your city by hand, wttrin can detect it for you: + +#+begin_src emacs-lisp + M-x wttrin-set-location-from-geolocation +#+end_src + +This looks up your city via IP geolocation, shows the detected location, and sets =wttrin-favorite-location= after you confirm. To make the setting persist across Emacs sessions, run =M-x customize-save-variable RET wttrin-favorite-location RET=, or add =(setq wttrin-favorite-location "Your City, State")= to your init file. + +The default lookup provider is =ipapi.co=. Two alternatives ship with the package, both free and key-less: + +#+begin_src emacs-lisp + (setq wttrin-geolocation-provider 'ipapi) ;; ipapi.co (default, 30k/month) + (setq wttrin-geolocation-provider 'ipinfo) ;; ipinfo.io (50k/month) + (setq wttrin-geolocation-provider 'ipwhois) ;; ipwho.is (10k/month) +#+end_src + +*Note:* IP-based geolocation can be wrong when you are behind a VPN or using a mobile hotspot. The confirmation prompt lets you reject an inaccurate result. If you prefer, set =wttrin-favorite-location= directly to any city string that wttr.in understands. + ** Debugging and Troubleshooting If something isn't working, debug mode logs every fetch, every display update, and every error. |
