Revision history for Net-Jabber-Bot 3.01 2026-04-03 Todd Rinaldo [Fixes] - #69 Fix from_full attribute to use resource instead of alias, which caused incorrect sender identification (PR #64) - Fix self-message detection in MUC group chats — bot could process its own messages as if from another user (PR #59) - Fix Start() to reconnect on silent disconnection when Process returns undef (PR #63) - Fix SetForumSubject to propagate send errors instead of silently discarding them (PR #68) - Fix message chunking off-by-one that could exceed max_message_size by one character (PR #71) - Replace // operator with ternary for Perl 5.8 compatibility (PR #70) [Improvements] - Bump MIN_PERL_VERSION from 5.008 to 5.010 in Makefile.PL (PR #66) [Maintenance] - Parallelize Windows and macOS CI jobs with Linux matrix (PR #73) - New test: comprehensive coverage for 6 undertested public API methods (PR #60) - New test: comprehensive coverage for message_function callback contract (PR #61) - New test: comprehensive coverage for presence and IQ protocol handlers (PR #62) - New test: comprehensive coverage for message sending pipeline (PR #65) - New test: coverage for SetForumSubject method (PR #67) - Update MANIFEST and README.md 2.1.9 2026-03-22 Todd Rinaldo [Fixes] - Fix uninitialized value warning in SendJabberMessage when concatenating error strings from chunked messages via .= on undef variable; also fix POD method name typo (get_ident -> get_responses) and broken E escape sequence (PR #58) - Guard all public API methods (ChangeStatus, GetRoster, GetStatus, Process, JoinForum, AddUser, RmUser) against crashes when called while disconnected — previously crashed with "Can't call method on an undefined value" (PR #55) - Fix misleading "Message not relevant to bot" debug log that fired for all messages instead of only genuinely irrelevant ones (PR #57) [Improvements] - Add Stop() method for graceful shutdown of Start() event loop; Start() now returns the loop iteration count and can be re-called after Stop() (PR #56) [Maintenance] - Remove dead code: unused $iqReply and unreachable block in _jabber_in_iq_message, unused $reconnect_timeout in Start() (PR #57) - Remove legacy Class::Std commented-out attribute declarations, write real documentation for GetStatus, AddUser, and RmUser methods (PR #58) - New test: t/07-test_disconnect_public_api.t for public API calls while disconnected (PR #55) - New test: t/08-test_start_stop.t for Stop() and Start() lifecycle (PR #56) 2.1.8 2026-03-20 Todd Rinaldo [Fixes] - #12 Fix broken reconnection (called nonexistent InitJabber), fix IsConnected always returning truthy, handle undef jabber_client after disconnect, and plug memory leak in messages_sent_today (PR #18) - #14 Fix GTalk connection failures and from_full operator precedence bug that returned only the username instead of user@server/alias (PR #16) - #9 Update POD docs to match newline-preserving regex behavior and add multiline message tests (PR #19) - #28 Remove legacy developer names from bot_example.pl AUTHOR section (PR #29) - #30 Migrate from Moose to Moo, replace MooseX::Types with Type::Tiny/Types::Standard, remove Config::Std dependency (PR #47) - #37 Remove disproportionate sleep 30 from BUILD legacy parameter handling (PR #43) - #38 Fix MockJabberClient::Disconnect setting is_connected=1 instead of 0 (PR #44) - #39 Add missing RosterDB/RosterRequest/RosterDBJIDs stubs to mock client (PR #45) - #40 Fix uninitialized value warnings from .= on fresh variables in tests (PR #42) - #48 Suppress 'Subroutine redefined' warnings in MockJabberClient (PR #50) - #32 Eliminate unnecessary sleeps from mock test suite, cutting runtime from ~120s to ~60s (PR #51) - Fix four bugs in Bot.pm: broken string interpolation of method call, typo in error message, variable shadowing in SetForumSubject, and crash on reconnect from undefined background_function (PR #20) - Mask plaintext password in DEBUG log output and fix operator precedence bug (PR #26) - ReconnectToServer now survives _init_jabber failures instead of dying on transient server outages; partial jabber_client state is cleaned up and the retry loop continues with exponential backoff. Also fixes $] version formatting in IQ responses. (PR #53) - Don't count unsent messages toward the hourly rate limit; _send_individual_message was incrementing the counter before checking IsConnected, which could exhaust the limit during disconnection and block legitimate messages after reconnection. (PR #54) [Improvements] - #13 Add optional $from parameter to SendPersonalMessage, SendGroupMessage, and SendJabberMessage for relay bots (PR #17) - #36 Make auto-subscribe to presence requests configurable via new auto_subscribe attribute (PR #46) [Maintenance] - #23 Consolidate three CI workflows into single testsuite.yml, update actions/checkout v1→v4, use perldocker/perl-tester images, add dynamic perl-actions/perl-versions matrix (PR #24) - #33 Extend CI test matrix back to Perl 5.10 (PR #52) - Modernize Makefile.PL: separate TEST_REQUIRES, add CONFIGURE_REQUIRES, MIN_PERL_VERSION, upgrade META_MERGE to meta-spec v2 (PR #21) - Modernize POD: fix typos, update URLs to cpan-authors org, fix command injection in bot_example.pl, fix string comparison bug in gtalk_RSSbot.pl (PR #22) - Add cpanfile for modern CI dependency management (PR #24) - Add CLAUDE.md with project conventions (PR #25) - Move README.md to .github - New test: t/07-test_reconnect_failure.t for reconnection resilience - New test: t/07-test_disconnect_message_count.t for rate-limit accounting during disconnection 2.1.7 2020-11-05 Todd Rinaldo - #15 Fix _send_individual_message to not strip new lines. 2.1.6 - Fix examples for new moose code - Spelling errors in documentation - Display server error message when we think there was a disconnect event. - Allow the user to specify the path to the CA cert bundle via the 'ssl_ca_path' parameter. - Move jabber object creation to lazy moose - Add ignore file to repo - Clean up POD so new() documentation lays out correctly - Remove DD from code. Moose has a helper sub already for this anyways - Explicitly set priority of users - Adam Malone - Allow the user to specify the path to the CA cert bundle via the 'ssl_ca_path' parameter - Jan Schaumann - Don't bail if the IQ message doesn't contain a query - Jan Schaumann - Allow user to disable server certificate validity check - eleksir - Use Mozilla::CA for default path for ssl_ca_path - eleksir - Fix undefined warnings due to insufficient Moose Laziness - Misc distro file cleanup. - Automated testing with github actions - Remove author tests from user installs. - Point support to github now. 2.1.5 - resource now unique per instance of bot based on alias_hostname_pid - new dependency from core modules - Sys::Hostname - __PACKAGE__->meta->make_immutable; for performance. - Removed gtalk option. Use tls => 1, server_host => 'gmail.com' instead. - using 'componentname' in connect rather than after connection like we were hacking it in. - All non-printable characters stripped and replaced with '.' via [:printable:] regex - Added documentation on minimal connect parameters now we have quite a few optionals. 2.1.4 - _process_jabber_message was failing to parse multiline strings - fixed - Move to github - http://github.com/toddr/perl-net-jabber-bot - Tickets/Groups will stay on Google for now. - Discussed using Backend of POE::Component::Jabber which would be a more stable/supported solution but requires perl 5.10 - MooseX::Types now. - no Moose and no MooseX::Types at end of object for droppings 2.1.3 - Tests were failing if people didn't have Config::Std installed which is only used for Author tests 2.1.2 - Added warning message for legacy users initializing with message_callback or background_activity. 2.1.1 - Add proper meta data into makefile.pl - Cleanup debug messages. Used to be able to do them inline but moose subs don't call inside a string any more. 2.1.0 - MOOSE!!! 2.0.9 - New subroutines (AddUser, RmUser, GetStatus, GetRoster) to track ??? - IsConnected reports connect status now. - ReConnect now works as expected. Calls background each re-connect attempt. 2.0.8 - Bot now resonds to iq requests for version info. Also added gtalk example into the manifest (forgot for 2.0.7) 2.0.7 - Fix to get gtalk working, kindly provided by Yago Jesus. It's doing something really funky with setting the hostname to gmail.com. - Need to later review why we're doing this. maybe we're ignorning connect messages from the server? - Also added gtalk bot example courtesy of Yago - New subs: GetRoster, ChangeStatus 2.0.6 - Test::Pod::Coverage not configured to skip tests if not avail. Corrected this. 2.0.5 - Missed a test file mentioning IO::Prompt (t/03) 2.0.4 - Removed some email addresses present. - Tidy up manifest - Referring to google project in POD now. - Inserted gtalk fixes so the module will work with them. - Funky eval issue with gtalk client commented out. We'll have to look at that later, but for now we don't need it at all 2.0.3 - Creation of Mock Client to allow automation of testing without a server. - Also added Example script so someone can see how to use the module. 2.0.2 - Added Log::Log4Perl as dependancy. This should be in everyone's CPAN so it shouldn't be a big deal that people need to install it even though it's not necessary for people to use the module... 2.0.1 - Oops! Guess I need to make this module dependant on Net::Jabber if it's ever going to make test. 2.0.0 - Move to 3 digit version (see pause.perl.org FAQ about starting with 2 digit version and going to 3) - internal callback maker created to reduce code. 1.2.1 - Call back functions how call self funcion via anonymous subs. - Minor bug fixes and cleanup. 1.2.0 - Re-enabled config test, plus fixed some docs. Versioning changes from here out to be 3 digit. - Bot will respond to different addressings per forum (all messages, jbot:, etc.) 1.1 - Initial CPAN release - Basic tests built. Still more needed. Some of the limits are hard - coded. Arguably, these should be more in a child module, not the base class? - 1.0 Initial pre-CPAN release -- Does basic stuff but no tests yet. not CPAN ready