Commit Graph

584 Commits

Author SHA1 Message Date
agessaman 12e677a9cf Update default value for condense_paths in MultitestCommand
- Changed the fallback value for condense_paths from False to True in the MultitestCommand class, ensuring that paths are condensed by default. This adjustment improves the command's usability and aligns with expected behavior.
2026-04-04 09:52:22 -07:00
agessaman c6a7355b3c Enhance multibyte path statistics and UI in web viewer
- Added calculations for contacts and incoming packets with multibyte path evidence over the last 7 days in `app.py`, improving data accuracy.
- Introduced new methods for handling multibyte path chunks and counting packets from JSON data, enhancing backend functionality.
- Updated `contacts.html` and `index.html` templates to display multibyte path encoding badges and tooltips, improving user interface clarity.
- Enhanced CSS for path encoding badges to differentiate between multibyte and one-byte paths, ensuring better visual representation.

These changes improve the overall user experience and data representation in the Bot Data Viewer.
2026-04-03 20:27:00 -07:00
agessaman 48fd46287e Refactor MQTT weather configuration and payload handling
- Updated `config.ini.example` to include detailed MQTT weather configuration options, enhancing clarity and usability.
- Expanded JSON template placeholders in `mqtt_weather.py` to support additional weather data fields, improving data representation.
- Introduced new utility functions for better handling of numeric and non-negative integer values in payload formatting.
- Enhanced test coverage for MQTT weather functionality, ensuring robust handling of extended placeholders and configuration loading.

These changes improve the flexibility and reliability of the MQTT weather integration, allowing for more comprehensive weather data management.
2026-04-03 17:05:18 -07:00
agessaman 301c231f12 Update Dockerfile to include additional dependencies for improved build environment
- Added `libffi-dev` and `libssl-dev` to the first RUN command for enhanced support of cryptographic operations.
- Included `libffi8` in the second RUN command to ensure compatibility with specific libraries.

These changes optimize the Docker image for building applications that require these libraries.
2026-04-03 11:57:27 -07:00
agessaman f829c9e30b Update JSON placeholders in feeds.html and mesh.html for improved readability
- Changed single quotes to HTML entities in JSON placeholders within the feeds.html file to ensure proper rendering.
- Updated the assignment of PREFIX_HEX_CHARS in mesh.html to parse the value as an integer, enhancing type safety and clarity.

These changes enhance the user interface and code maintainability in the web viewer templates.
2026-04-03 11:36:33 -07:00
agessaman 531e87bcd9 refactor(weather): use APScheduler for daily forecast cron
Remove the schedule package; align fixed alarm times with bot timezone
via get_config_timezone like MessageScheduler.
2026-04-03 11:26:54 -07:00
agessaman f4efcc792d fix(ci): restore frontend lockfile, satisfy ShellCheck, add schedule dep 2026-04-03 11:26:45 -07:00
agessaman 6ff876ab15 Refactor type hints and imports across multiple modules
- Updated type hints to use `|` for union types instead of `Optional` where applicable, enhancing readability and consistency.
- Cleaned up import statements by removing unnecessary imports and organizing them for better clarity.
- Adjusted function signatures in various modules to reflect the new type hinting style, improving type safety and code maintainability.

These changes contribute to a more modern and consistent codebase, aligning with current Python typing practices.
2026-04-03 11:15:47 -07:00
agessaman b3d5054074 Merge branch 'integration/massive-pr' into dev
Resolve conflicts by combining v0.9 integration work with dev-only behavior:
- Keep channel_responses_enabled, greeter pause checks, and max_response_hops gating
- Retain TRACE/repeat handling, MQTT weather, temperature format helpers, and feed tooling
- Unify package-data globs, ruff/mypy/pytest config, Rate_Limits/Webhook in config example
- Web viewer: config panels + X-Requested-With on channel API; drop redundant DBManager import

Made-with: Cursor
2026-04-03 10:51:50 -07:00
agessaman 7bc4efff31 Update Dockerfile and GitHub Actions workflow for improved build process
- Modified the Dockerfile to set ownership of copied files directly during the copy operation, enhancing file permissions management.
- Updated the GitHub Actions workflow to limit the build platforms to linux/arm64 and linux/arm/v7, streamlining the build process for specific architectures.

These changes improve the efficiency and reliability of the Docker image build process.
2026-04-03 06:56:41 -07:00
agessaman 0e1372e3d4 Enhance package data validation and error handling in scripts
- Added a trap command in `check-package-data.sh` to ensure cleanup of temporary files on exit.
- Improved error handling in `context_checkpoint.sh` for flushing pending bugs to `BUGS.md`, providing warnings if write operations fail.
- Implemented file locking in `post_tool_counter.sh` to ensure atomic increment of the tool counter, preventing race conditions.

These changes improve the reliability and robustness of package data checks and related scripts.
2026-04-02 10:57:58 -07:00
agessaman 60cbf79a3d Implement concurrency controls for auto-purge and per-key removal in RepeaterManager
- Introduced locking mechanisms to prevent overlapping auto-purge runs and duplicate purge attempts for specific keys.
- Added methods to manage in-flight purge attempts, ensuring that concurrent calls do not interfere with each other.
- Updated the `check_and_auto_purge` method to utilize the new locking logic, enhancing the reliability of the auto-purge process.
- Expanded test coverage to validate the new concurrency controls, ensuring correct behavior under concurrent execution scenarios.

These changes improve the stability and efficiency of the repeater management system during purge operations.
2026-04-02 10:35:47 -07:00
agessaman 9d768a3cf7 Implement MQTT weather support in weather commands and configuration
- Added new configuration options in `config.ini.example` for enabling and configuring MQTT weather sources.
- Updated `WxCommand` and `GlobalWxCommand` classes to retrieve weather data from custom MQTT topics, enhancing flexibility in weather data sources.
- Introduced error handling for MQTT data retrieval, ensuring robust responses for various error scenarios.
- Expanded translation strings in `en.json` to support MQTT-related messages, improving user feedback.

These changes enhance the application's capability to utilize MQTT for weather data, providing users with more options for weather information retrieval.
2026-04-02 10:24:49 -07:00
agessaman e3d4e2db6e Update Bugs.md to reflect current project state and plans. 2026-03-30 20:10:10 -07:00
agessaman 81866487ab Fix UnboundLocalError in decode_meshcore_packet for invalid hex input
- Ensured `byte_data` and `hex_data` are always defined for error logging, preventing UnboundLocalError when handling invalid hex strings.
- Updated test case to confirm that invalid hex input returns None without raising exceptions, improving error handling in the message decoding process.

These changes enhance the robustness of the message handling system by addressing potential error scenarios.
2026-03-30 19:49:39 -07:00
agessaman f3e667e64f Enhance TRACE payload handling and path extraction in message processing
- Updated `update_mesh_graph_from_trace_data` to clarify the format of `path_hashes` as per-hop hash strings from the trace payload.
- Modified `MessageHandler` to differentiate between TRACE packets and regular transmissions, preventing incorrect extraction of repeater prefixes from RF path bytes.
- Introduced `parse_trace_payload_route_hashes` utility to extract TRACE route hash segments from payloads, ensuring accurate handling of path data.
- Enhanced `PacketCaptureService` to correctly populate packet information for TRACE packets, including SNR path and route hashes.
- Expanded test coverage for TRACE payload decoding and path extraction to validate functionality and correctness.

These changes improve the accuracy and reliability of TRACE data processing in the application.
2026-03-30 17:36:52 -07:00
Adam Gessaman b297b9da9d Merge pull request #132 from mrzarquon/feat/max_hops
Adds `max_response_hops`
2026-03-30 07:45:11 -07:00
Chris Barker 8966be89a6 Adds max_response_hops
Before this there was no way to prevent the bot to reply to random
channel noise from a temprorary strong link to another distant mesh.

This provides the ability for users in larger meshes to cap the bot
to reply to only messages sent likely from nearby repeaters. This works
well in conjunction with region scoping.

Default value is still 64, to not change behavior on existing installs,
but the example config.ini's all include a suggested start valu of 10.
2026-03-30 15:11:05 +01:00
agessaman 6a7a79af3c Refactor path node ID extraction and distance calculation in utils
- Introduced `extract_path_node_ids_from_message` to streamline extraction of node IDs from mesh messages, prioritizing `routing_info.path_nodes` and supporting multi-byte comma parsing.
- Updated `calculate_path_distances` to accept an optional message parameter, enhancing its functionality by allowing it to derive node IDs from messages.
- Added `node_ids_from_path_string` to handle parsing of path strings into node IDs, improving the handling of both legacy and multi-byte formats.
- Refactored `TestCommand` to utilize the new extraction function, ensuring consistent behavior across commands.
- Expanded test coverage for new utility functions to validate their correctness and robustness.

These changes improve the clarity and maintainability of path-related utilities, enhancing overall functionality in message processing.
2026-03-29 22:05:36 -07:00
agessaman 5b1bcac2a0 Implement temperature formatting in weather commands and services
- Added new configuration options in `config.ini.example` for customizing the display of daily high/low temperatures.
- Introduced `format_temperature_high_low` function in `utils.py` to format temperature strings based on user-defined templates.
- Updated `WxCommand`, `GlobalWxCommand`, and `WeatherService` classes to utilize the new formatting function, enhancing the presentation of temperature data in weather forecasts.
- Refactored existing high/low temperature handling to improve code clarity and maintainability.

These changes enhance the flexibility and readability of temperature displays in weather-related outputs.
2026-03-29 21:22:00 -07:00
agessaman 5f6eced45d Add Open-Meteo model selection support in weather configuration
- Introduced a new configuration option for selecting Open-Meteo models in `config.ini.example`, allowing users to specify a model or default to "best_match".
- Implemented `_load_weather_model` method in `GlobalWxCommand` and `WeatherService` classes to handle model selection logic, including validation and fallback mechanisms.
- Updated API request parameters to include the selected weather model when available, enhancing the flexibility of weather data retrieval.

These changes improve the customization of weather data requests and ensure robust handling of model selection in the application.
2026-03-29 20:58:26 -07:00
agessaman aa2677bc4b Add Unix signal handling for graceful shutdown and config reload
- Introduced a new function to configure Unix signal handlers for SIGTERM, SIGINT, and SIGHUP, allowing for graceful shutdown and in-process configuration reload.
- Updated the main function to utilize the new signal handling setup, improving the bot's responsiveness to system signals.
- Enhanced documentation in the service installation guide to clarify the use of the reload command for configuration changes without restarting the service.

These changes improve the bot's operational flexibility and user experience during configuration updates.
2026-03-29 20:32:54 -07:00
agessaman 43f450e702 Update path formatting and message handling in commands
- Modified path formatting in `multitest_command.py` to use ideographic space for nested branches, enhancing visual clarity.
- Updated the `schedule_command.py` to strip control characters from messages, ensuring safe and clean previews.
- Adjusted test cases in `test_multitest_command.py` to reflect changes in path formatting, improving consistency across tests.

These changes enhance the readability of path outputs and improve message handling in scheduled commands.
2026-03-29 20:27:18 -07:00
agessaman 507c7ad31e Enhance database migration safety and improve repeater management
- Added a regex pattern to validate SQLite column definitions, preventing SQL injection in the _add_column() function.
- Introduced a new validation function to ensure safe column definitions are used.
- Updated repeater_manager.py to use list() for iterating over contacts, ensuring compatibility with potential changes in the underlying data structure.
- Enhanced error handling in the MessageScheduler for better debugging during scheduler shutdown and message sending.

These changes improve the security and reliability of database operations and enhance the robustness of the repeater management system.
2026-03-29 20:00:44 -07:00
agessaman 4685ea734c Enhance contacts UI with mobile-friendly toolbar and search functionality
- Introduced a responsive toolbar for filtering and searching contacts, improving usability on mobile devices.
- Added a dropdown for timespan selection, allowing users to filter contacts based on different timeframes.
- Updated styles to ensure consistent alignment and height for toolbar elements, enhancing the overall appearance and functionality.

These changes improve the user experience for managing contacts in the web viewer.
2026-03-29 17:29:49 -07:00
agessaman da2e39c6b9 Enhance mobile contact management UI and functionality
- Introduced a mobile-friendly layout for the contacts section, including a new mobile stack for displaying contact cards.
- Added sorting options for contacts on mobile devices, allowing users to sort by various criteria such as name, device type, and distance.
- Implemented a select-all checkbox for mobile view to improve user interaction with contact selection.
- Updated event listeners to handle changes in selection and sorting, ensuring a seamless experience across devices.

These changes improve usability and accessibility for mobile users in the web viewer.
2026-03-29 17:13:01 -07:00
agessaman ae52be4d2b Enhance logging and UI elements in web viewer
- Added a function to strip ANSI color codes from log lines for better display in SocketIO web clients, improving log readability.
- Implemented dark mode styles for dropdown menus and other UI components to enhance user experience in dark theme.
- Updated the contacts template to include a new overflow menu for additional actions, improving accessibility and usability.
- Enhanced the login page with a more visually appealing layout and improved theme handling to prevent flash of unstyled content.
- Refined log level toggles in the logs template for better user interaction and visibility of log levels.

These changes improve the overall functionality and aesthetics of the web viewer.
2026-03-29 16:56:01 -07:00
agessaman a2a121b4e7 Enhance API request headers across multiple templates
- Added 'X-Requested-With' header to various API requests in channel_operations.js, cache.html, config.html, contacts.html, feeds.html, greeter.html, mesh.html, radio.html, and other templates to improve request handling and prevent potential issues with cross-origin requests.
- Ensured consistent header usage across all relevant fetch calls to enhance security and compatibility.

These changes improve the robustness of API interactions within the web viewer.
2026-03-29 15:45:42 -07:00
agessaman 14a3b575cb Implement deduplication lock and improve advert handling in MapUploaderService
- Introduced an asyncio lock to serialize deduplication checks and updates to seen adverts, preventing race conditions during concurrent advert processing.
- Enhanced replay attack detection by ensuring deduplication state is consistent across await boundaries.
- Improved logging for duplicate advert uploads and invalid coordinate handling, providing clearer feedback on advert processing outcomes.

These changes enhance the reliability and integrity of advert uploads in the MapUploaderService.
2026-03-29 15:11:55 -07:00
agessaman 3a9f7103dc Update TODOs, enhance database management, and implement CSRF protection in web viewer
- Updated TODO.md with the latest status and coverage metrics.
- Added date and datetime adapters for SQLite in db_manager.py to improve date handling.
- Refactored repeater_manager.py to ensure atomic database operations within transactions, enhancing data integrity.
- Implemented CSRF protection and security headers in web_viewer/app.py to safeguard against cross-origin requests and improve response security.
- Enforced authentication for non-loopback interface binding in web_viewer/integration.py to prevent unauthorized access.

These changes enhance the overall security, reliability, and maintainability of the application.
2026-03-29 15:03:51 -07:00
agessaman ea0e25d746 Implement LRU caching for SNR and RSSI in MessageHandler and enhance rate limiting with thread safety
- Updated MessageHandler to use OrderedDict for SNR and RSSI caches, implementing LRU eviction to maintain a maximum size.
- Added thread safety to rate limiting classes by introducing locks, ensuring consistent behavior in concurrent environments.
- Introduced periodic cleanup in TransmissionTracker to manage memory usage effectively.
- Added unit tests for LRU cache behavior and automatic cleanup functionality.

These changes improve performance and reliability in handling message data and rate limiting.
2026-03-29 14:11:12 -07:00
agessaman 12c8c0b787 Add unit tests for wx and gwx _count_display_width
Assert UTF-8 byte length semantics (ASCII, emoji, mixed) and parity between WxCommand and GlobalWxCommand.

Made-with: Cursor
2026-03-29 13:42:52 -07:00
agessaman f99c6dc084 Add tests for UTF-8 OTA message limits (PR #128)
Cover BaseCommand.get_max_message_length (DM/channel, meshcore, Unicode name, 130-byte floor), PathCommand byte truncation and _send_path_response splitting, and parity between CommandManager and BaseCommand.

Made-with: Cursor
2026-03-29 13:40:58 -07:00
agessaman 49c6b94584 Mirror BaseCommand UTF-8 OTA limits in CommandManager
CommandManager.get_max_message_length now uses 158-byte DM budget and 160-byte channel body budget minus UTF-8 username and ": " prefix, with the same 130-byte floor as BaseCommand. Update TestGetMaxMessageLength expectations.

Refs: https://github.com/agessaman/meshcore-bot/pull/128
2026-03-29 13:36:33 -07:00
Chris Close 70aec6053e Change max lengths 2026-03-29 13:34:15 -07:00
Chris Close e2725686ef Fix path message truncation for emoji (double-width) characters
Use UTF-8 byte length instead of character count or display width for message
truncation. This fixes an issue where emoji characters like 😀 (4 UTF-8 bytes,
1 character, 2 display units) caused messages to exceed the RF packet size.

Changes:
- Replace _count_display_width with byte-based length calculation
- Add _count_byte_length and _truncate_to_byte_length helper methods
- Update get_max_message_length to use 127 bytes (channel limit) not 150
- Add type hints to new methods
2026-03-29 13:33:58 -07:00
agessaman 83b23385a7 Refine path formatting and testing in MultitestCommand
- Updated path formatting logic in `MultitestCommand` to include a corner marker (┐) for shared paths, enhancing visual clarity.
- Improved documentation in `config.ini.example` to reflect changes in path formatting behavior.
- Expanded test cases to validate the new corner marker functionality and ensure accurate representation of unique paths with shared prefixes.
2026-03-29 13:32:30 -07:00
agessaman 99e660afc3 Enhance path formatting in MultitestCommand with new grouping logic
- Updated the path formatting logic in `MultitestCommand` to support nested branches using shared prefixes and horizontal continuations.
- Introduced new utility functions for grouping and formatting suffix lines, improving the clarity of output paths.
- Modified the configuration example to clarify the behavior of the `condense_paths` option.
- Expanded test coverage to validate the new path formatting behavior, ensuring accurate representation of unique paths.
2026-03-29 11:02:30 -07:00
agessaman 9859b41d9e Implement path condensing feature in MultitestCommand and update configuration
- Added a new configuration option `condense_paths` in `config.ini.example` to control path formatting.
- Enhanced `MultitestCommand` to condense output paths using shared prefixes and tree branches when `condense_paths` is enabled.
- Introduced utility functions for path processing, including `_condense_path_lines` and `_path_to_tokens`.
- Updated tests to validate the new path condensing functionality and configuration behavior.
2026-03-29 10:14:38 -07:00
agessaman d0497d983e Enhance database management and validation in DBManager and BotDataViewer
- Introduced validation for SQLite journal modes in DBManager, defaulting to "WAL" for invalid inputs and logging warnings.
- Added a new utility function in security_utils for validating SQL identifiers to prevent SQL injection.
- Updated BotDataViewer to utilize the new journal mode validation and SQL identifier checks, ensuring safer database operations.
- Enhanced test coverage for restore functionality, including checks for backup directory configuration and path traversal prevention.
2026-03-29 09:45:18 -07:00
agessaman fa4d0c200c Update tests for DiscordBridgeService to reflect channel key normalization
- Adjusted assertions in test cases to account for the title-casing of channel keys by the DiscordBridgeService, ensuring compatibility with the ConfigParser behavior.
- Updated test_single_webhook_backward_compatible and test_multiple_webhooks_parsed_and_queued to check for "Public" instead of "public" in channel_webhooks.
2026-03-29 08:56:12 -07:00
agessaman f052428394 Update configuration and documentation for Repeater Prefix Collision Service
- Removed MQTT configuration from `config.ini.example` to streamline settings.
- Added new section for Repeater Prefix Collision Service in `config.ini.example`, including options for enabling notifications, alert channels, and prefix handling.
- Updated `service-plugins.md` to include documentation for the new Repeater Prefix Collision Service, enhancing user awareness of available plugins.
2026-03-29 08:56:12 -07:00
agessaman d9ea209ad7 Enhance weather service forecast output with high/low temperature display
- Added today's high and low temperatures to the weather forecast output, improving clarity for users.
- Updated formatting to include labels for high and low temperatures, ensuring better readability of the forecast information.
2026-03-29 08:55:50 -07:00
agessaman 433cd5675a Implement locking mechanism for message processing in FeedManager
- Introduced a lock to serialize access to the message processing queue, preventing concurrent executions that could lead to race conditions.
- Updated the process_message_queue method to utilize the new lock, ensuring safe access to the inner processing logic.
- Increased the timeout for awaiting feed message queue processing in the MessageScheduler to 600 seconds, accommodating longer processing times for queued items.
2026-03-29 08:55:36 -07:00
agessaman 4d9cdcba50 Update configuration and documentation for Repeater Prefix Collision Service
- Removed MQTT configuration from `config.ini.example` to streamline settings.
- Added new section for Repeater Prefix Collision Service in `config.ini.example`, including options for enabling notifications, alert channels, and prefix handling.
- Updated `service-plugins.md` to include documentation for the new Repeater Prefix Collision Service, enhancing user awareness of available plugins.
2026-03-29 08:36:45 -07:00
agessaman e037046400 Enhance weather service forecast output with high/low temperature display
- Added today's high and low temperatures to the weather forecast output, improving clarity for users.
- Updated formatting to include labels for high and low temperatures, ensuring better readability of the forecast information.
2026-03-25 20:26:22 -07:00
agessaman cebf2cbc8b Implement locking mechanism for message processing in FeedManager
- Introduced a lock to serialize access to the message processing queue, preventing concurrent executions that could lead to race conditions.
- Updated the process_message_queue method to utilize the new lock, ensuring safe access to the inner processing logic.
- Increased the timeout for awaiting feed message queue processing in the MessageScheduler to 600 seconds, accommodating longer processing times for queued items.
2026-03-22 13:16:00 -07:00
agessaman 6246a81ab3 Enhance real-time message display and layout in web viewer
- Added new CSS styles for live message metadata badges and layout adjustments for better visual organization.
- Reorganized the HTML structure of the real-time message and packet stream sections for improved responsiveness and clarity.
- Updated JavaScript functions to support new channel key normalization and hashing for enhanced message handling.
- Modified test cases to reflect changes in message entry templates and ensure proper functionality of new features.
2026-03-21 22:07:43 -07:00
agessaman 4a37b9179a Refactor datetime handling in maintenance module and web viewer
- Introduced a new `_utc_now` function in `maintenance.py` to standardize UTC time retrieval, replacing deprecated `utcnow()` calls.
- Updated all instances of `datetime.utcnow()` in `maintenance.py` to use the new `_utc_now` function for consistency.
- Modified `app.py` in the web viewer to use `datetime.now(timezone.utc)` instead of `datetime.utcnow()`, ensuring timezone awareness.
- Enhanced MQTT test suite with new v2 callback methods for improved connection handling and error reporting.
2026-03-21 21:11:05 -07:00
agessaman a6b30c833c Add feed subscription seeding function for test setup
- Introduced `_seed_feed_subscription` function to insert minimal feed subscription data into the database, ensuring successful foreign key inserts for feed activity and errors during tests.
- Updated `TestProcessRssFeed` to utilize the new seeding function, enhancing test reliability and setup consistency.
2026-03-21 20:46:14 -07:00