Releases: 3urobeat/steam-comment-service-bot
Version 2.15.4
Additions:
- Log error stack (if available) when creating session fails
- Unified all request (comment, vote, ...) iteration skip handlers into one
- Unified all request (comment, vote, ...) error handlers into one
- This also brings features like aborting request on IP cooldown on all proxies to non comment request types
- The
!failed
command now mentions the type of request in its response - Added progress log message in
dataProcessing
to accurately reflect if bot is hanging on converting owner and group vanities to IDs
Fixes:
- Fixed continuously running "Finished logging in..." animation
- Fixed "Detected inactivity [...]" message not displaying non-populated accounts
- Fixed "Detected inactivity [...]" message printing multiple times per minute
- Fixed login softlock checker not handling inactivity when account is online but not populated
- Fixed "[...] waiting for user object [...] to populate" message spamming output file
- Fixed group issues in dataProcessing & log issues in ready when config prop is missing
- Fixed handleMissingGameLicenses causing webSession to loop when config prop is missing
- Fixed supplying steam-session login data without username/password, leading to cryptic error for users
- The session handler now clarifies which account is missing a password
- Fixed controller interpreting Promise from Updater wrong, leading to a short lived double startup behavior after an update
Changes:
- Renamed
commentsIpCooldownPenalty
advancedconfig setting torequestsIpCooldownPenalty
- This cooldown now applies to all request types, this rename reflects that change
- Added compatibility feature to transfer customized setting
- The
!failed
command now refers to index as interaction to use more intuitive terms - Revised a bunch of log messages to improve user experience
- Failing to load a language file does not log a confusing error stack anymore before it gets replaced by
dataIntegrity
- Failing to load a language file does not log a confusing error stack anymore before it gets replaced by
- Softlock Handler log messages now include a timestamp
- Refactored a few parts of the codebase
- Moved expiring tokens job register call to ready event and run it instantly
- Replaced deprecated
--production
flag in npm commands with--omit=dev
- Updated dependencies
- Minor other changes
Version 2.15.3
Additions:
- Added a few new default quotes
- Added note about escaping newline in quotes to setup guide
- Added commentsIpCooldownPenalty setting to advancedconfig #250
- Added VsCodium project file to remote repository to store command for starting debug session
- Rest-API Plugin: Added support for subscribing to PluginSystem events. See the Pull Request DerDeathraven/steam-comment-bot-rest-api#10 for more info.
Fixes:
- Fixed IP cooldown error penalty in comment requests stacking when using proxies #250
- Fixed all proxies failed detection in comment processes triggering too soon, leading to aborted request with functioning proxies still left
- Fixed Unhandled Rejection error when logging proxy used to login when proxy provided in proxies.txt did not include 'http://' #248
- Fixed SteamCommunity requests failing when using proxies not preceded by 'http://' #248
- Fixed proxy switcher logging suppressed messages during startup
- Fixed proxy error on initial login causing a softlock
- Fixed friend commands not prefixing success messages with
/me
- Fixed intentionally escaped newline characters in quotes getting 'activated'
- Docs: Fixed broken link in setup guide
- Docs: Fixed broken link in accounts.txt comment
- Docs: Fixed missing reference to unload function in plugin documentation
- Discord Plugin: Fixed registerCommands failing when a command does not provide any args and added a check to avoid an Unhandled Rejection when using an outdated node.js version
Changes:
- Drastically reduced complexity of getting bot accountName by making it a top-layer property
- Refactored unfriendCheck handler
- Docs: Reworked adding proxies page
- Removed docs directory from file checksum check
- Updated dependencies
- Minor other changes
Version 2.15.2
Additions:
- Added traditional chinese translation @Tira-tw in #242
- Added !add alias to !addfriend command
- Added steamGuardQrCode event to enable plugins to resolve Steam Guard QR-Code requests
- Added more login related log messages to default log level
- Added more login related debug log messages to improve ability to debug login process resolving issues
- Added (experimental) force-resolve feature to login process when inactivity is detected
- Added setting 'enableRelogOnLogOnSessionReplaced' to
advancedconfig.json
to control whether the bot should relog accounts that have lost their connection with the error 'LogOnSessionReplaced'. Default value istrue
. To retain the same behavior as previously, where the bot would skip those accounts, set the value tofalse
.
Fixes:
- Fixed login starting faster than plugin load, making it unable for them to handle steamGuardCode events
- Fixed proxy switcher not switching to proxy 0
- Fixed default quotes file containing a political entry
- (Potentially) finally fixed 'Already logged on, cannot log on again' errors when relogging for good
- Fixed potential login softlock when account switches proxy while a login process is active, with that account queued in it
- Fixed wrong syntax of variable in language string 'addfriendcmdsuccess'
- Fixed 'userunfriend' & 'userforceunfriend' language strings being flipped internally
Changes:
- The bot will now always emit the ready event on the second login rerun even if POSTPONED accounts still exist
- Refactored some code to use the proper log prefix more consistently instead of sometimes switching to bot index
- Refactored some code to surround userIDs more consistently with quotation marks
- Refactored some code to simplify the unfriendall command
- Improved contributing page
- Improved issue templates
- Migrated eslint config for eslint v9 and added & enforced two more rules
- Updated hostname check
- Updated dependencies
- Minor other changes
Version 2.15.1
Fixes:
- Fixed login process being softlocked after an account attempted to switch from their faulty proxy
- Fixed failed vote & fav requests throwing an error when trying to log the error
Changes:
- Reduced amount of log messages logged during login, disconnect and relog
- Reduced amount of log messages logged during the general startup
- Reduced chances of startup ascii art showing an easter egg ascii art
- Updated dependencies
- Minor other changes
Version 2.15.0
Changes of note (TL;DR):
- Added new commands:
!funnyvote
,!jobs
- Added support for commenting and voting on reviews and for commenting on eventcomments discussions
- Drastically decreased startup time for larger instances with many proxies by applying logindelay per proxy instead of per account
- Added QR-Code login
- Added a JobManager to group routinely executed functions in one place and allowing the registration and unregistration of jobs during runtime
- Added automatic plugin update on boot and
botVersion
parameter to check and warn of version mismatch
If you are using a customlang.json
, make sure to read the language string changes at the end and update your file.
If you've made a plugin, check the 'Creating Plugins' wiki page and add the botVersion
parameter to your package.json
.
Additions:
- Added new commands:
!funnyvote
,!jobs
- Added support for commenting and voting on reviews! Suggestion in #207
- Updated
!comment
command to accept reviews - Updated
!upvote
&!downvote
commands to accept reviews - Added
!funnyVote
command for reviews - Added review detection support to handleSteamIdResolving helper
- Added a library patch to load my changes until my PR to the SteamCommunity library gets accepted
- Updated
- Added support for commenting on eventcomments discussions! Suggestion in #219
- Updated the discussion library patch associated to my SteamCommunity library PR
- Added a JobManager system
- The JobManager groups routinely executed functions in one place and allows the registration and unregistration of jobs during runtime
- Added
!jobs
command to see registered jobs directly from the Steam Chat (or any other Plugin which implements the CommandSystem)
- Added Chinese & Portuguese translation @isyuricunha in #232, Chinese updated by Scaperace
- Added automatic Plugin update on boot system
- Added
botVersion
parameter inpackage.json
requirement to plugins- Added a version mismatch check with warning message when plugin is loaded
- Added a
blockPluginLoadOnMismatchedBotVersion
setting toadvancedconfig.json
to manually block loading of plugins with mismatchedbotVersion
parameters
- Added support for logging in with a Steam Mobile App QR-Code
- Added support for setting online status for main account and child accounts in
advancedconfig.json
- Added
disableSendingRequests
setting toadvancedconfig.json
- Added
!requests
alias to!sessions
and!myrequests
alias to!mysessions
- Added EIdTypes enum to handleSteamIdResolving to document supported results
- Added a
!lang
cmd reference, including how many languages are currently supported, touseradded
message - Added
duplicateQuotesDetector.js
script to detect duplicate strings inquotes.txt
file - Added login cooldown/block detection to SessionHandler
- Added a stargazers over time chart to
README.md
Reworks:
- Logindelay is now applied per proxy instead of per account to greatly improve login speed for larger instances
- Accounts are divided into a fastQueue & slowQueue, depending on if they require user interaction (e.g. Steam Guard code input)
- Added POSTPONED bot EStatus to signal that account in fastQueue needs to be transferred to slowQueue
- Updated associated estimated login time calculation
- Improved logging of login progress and online status events
- Added more login guards to potentially prevent unwanted login requests
- Languages are now loaded dynamically on startup, instead of being hardcoded
- Reworked voting commands to compress
!upvote
and!downvote
into one function - Converted existing individual intervals to JobManager jobs
- Improved information logged by npminteraction handler for first time users
- Improved translating chapter on contribution wiki page
- Improved errors_doc wiki page as it was pretty outdated
- Improved Setup Guide wiki page styling with markdown highlights
- Improved various JsDocs
Fixes:
- Fixed new refreshToken not getting stored because event was not being handled
- Fixed plugins not being able to be installed without updating
fileStructure.json
by ignoringpackage.json
in script - Fixed player_name retrieval fail throwing error when user isn't cached when receiving or sending chat messages, e.g. immediately after accepting a friend request
- Fixed lang import failing when folder or only
english.json
is missing - Fixed certain class props not being included in
types.d.ts
because a JsDoc was missing or incorrect - Fixed
useradded
message being able to fail when sending too quickly after accepting friend request by delaying it by 2.5 seconds - Fixed
!update
response messages being able to fail because accounts were logged off too fast by delaying initiateUpdate() call by 2.5 seconds - Fixed incorrect command name
!vote
in help message by changing it to!upvote
- Fixed line number in dataImport quotes check warning message being wrongly offset by 1
- Fixed wrong/missing variable syntax in language strings associated to
!update
command - Fixed wrong/missing variable syntax in
commentretrying
language string - Fixed multiple "Already attempting to log on, cannot log on again" errors caused during login/relog, introduced by recent steam-user update
- Fixed low friendlist space warning showing bot[object Object]
- Fixed duplicate login requests being able to happen when login error handler and login timeout handler took action at the same time
- Fixed CommandHandler's
runCommand()
throwing error when resInfo parameter wasundefined
- De-duped strings in
quotes.txt
file
Changes:
- All request types will now enforce maxRequest settings set in
config.json
. Previously only the comment command would enforce it. - Improved up-/downvote ratingHistory database operations
- Improved missing accounts error message in vote and curatorFollow requests by returning specific nounlimited message
- Primary Group will now only be set if not already done. This does not reduce amount of requests (unless Steam weights requests differently and a editProfile request is heavier than a profile fetch) made but rather reduces log-noise
- Generalized requesttoohigh & commentnounlimitedaccs language strings to be used for all request types
- The dataIntegrity check is now getting executed slightly earlier on startup
- Updated
steam-comment-bot-template
,steam-comment-bot-webserver
,steam-comment-bot-discord-plugin
andsteam-comment-bot-rest
(#7, #8) to v2.15- Plugin
steam-comment-bot-webserver
is now shipped as a NPM registry package instead of as a locally packed one
- Plugin
- Updated russian translation by @sashascurtu in #235
- Disabled now unused 32 bit int limit
requestDelay * maxRequests
startup check - Updated wiki pages (config_doc, advancedconfig_doc, commands_doc, creating_plugins, steam_limitations, setup_guide) to accomodate changes made in this update
- Updated dependencies
- Minor other changes
Click me to see updated language strings
- These language keys have been added:
- genericnounlimitedaccs
- voteunsupportedtype
- requesttoohigh
- invalidreviewid
- errloadingreview
- jobscmdregistered
- jobscmdnoneregistered
- These language keys have been removed:
- commentrequesttoohigh
- commentnounlimitedaccs
- These language key's values have changed:
- commentcmdusageowner
- commentcmdusageowner2
- commentinvalidid
- commentunsupportedtype
- commentretrying
- useradded
- updatecmdforce
- updatecmdcheck
- helpvote
- helpfavorite
- abortcmdnoprocess
- failedcmdnothingfound
This list was generated using my langStringsChangeDetector.js script.
Version 2.14.1
Additions:
- Added logging of username in friendMessage event
- Added logging of friend relationship status in friendMessage and steamChatInteraction handlers
- Added official discord plugin to default package set
- Added a few emojis to the README.md to visually break up the wall of text
- Added a deprecation warning to
logininfo.json
import; please useaccounts.txt
Fixes:
- Fixed data integrity check failing when using an absolute path #217 by forcing working dir to
__dirname
instart.js
- Fixed two dependency errors on initial start caused by outdated node.js version
- Fixed
downloadUpdate()
deleting ratingHistory & userSetting database contents (whoops, sorry!) - Fixed plugin config not being updated when plugin data directory of previously installed plugin has been deleted
- Fixed TypeError and missing license detected when null was provided in
config.json
childaccplayinggames
- Fixed comments not allowed on friendsonly profiles
- Profile visibility is now handled better in general
- Fixed dataImport not resolving language correctly on restore
Changes:
- Bumped minimum supported node.js version to v16.0.0!
- This fixes the two aforementioned dependency issues on initial start
- Improved how logininfo object is accessed during login and clarified index -> accountName association in wiki
- Failed follow request now inserts user into
ratingHistory.db
anyway because enum 2 is also used for a duplicate request - Simplified inserting user into
lastcomment.db
database on friend request accept - Improved language string
failedcmdnothingfound
to include all request types; russian translation update by @sashascurtu - Ignored
package-lock.json
in dataIntegrity check system - Removed a few unnecessary last iteration checks when nothing async was happening
- Made
aggregatePluginConfig()
private - Updated every file header to ISO date and update copyright date
- Wiki: Improved
unfriendtime
config key explanation - Updated dependencies
- Minor other changes
Version 2.14.0
Changes of note (TL;DR):
- Added support for commenting in discussions using !comment
- Added support for following & unfollowing users/workshops/curators using !follow & !unfollow
- Added support for setting specific games for specific accounts
- Added a language system which currently supports english & russian. Each user can set their lang using !lang
- Reworked
customlang.json
structure to work with the new language system. Please read the updated customlang wiki page!
- Reworked
- Added a relogging handler which also attempts to switch out broken proxies - you no longer need to manually intervene to get accounts back online!
- The bot now longer stops itself when the main account looses connection
- Renamed
config.json
keyscommentdelay
,commentcooldown
,maxComments
&maxOwnerComments
torequestDelay
,requestCooldown
,maxRequests
,maxOwnerRequests
to apply to all request types - Renamed advancedconfig.json key
relogTimeout
tologinRetryTimeout
- Fixed a lot of bugs
If you are using a customlang.json
, make sure to read the language string changes at the end and update your file.
Additions:
- Added new commands: !follow, !unfollow
- Added support for commenting in discussions by updating !comment! Suggestion in #128
- Added a library patch to load my changes until my PR to the SteamCommunity library gets accepted
- Added support for following & unfollowing users/workshops and curators by adding two new commands as mentioned above! Suggestion in #163 & #207
- This feature was added to the SteamCommunity library in my PR #320
- Added a language system
- Added a
!lang
command to see all supported languages and to update your chosen one - Added a userSettings database to save language settings for every user who adds the bot
- Added a defaultLanguage setting to
config.json
- Added a
getLang()
function to the DataManager to get a language string- Supports replacing language string variables for you
- Automatically fetches the correct language for the user when a userID is provided
- Added russian translation @Blueberryy #186, updated by @sashascurtu #212
- Added an unsupported language check to DataManager's dataCheck
- Added a
- Added automatic renewal of refreshTokens that expire soon
- Enabled automatic renewal in steam-user options
- Added a
attemptTokenRenew()
function to the sessionHandler and call it from the handleExpiringTokens.js helper (this was done before steam-user added support, it now acts as a backup)
- Added a relogging system to attempt to recover failed logins after 15 minutes
- Supports switching out broken proxies - you no longer need to manually intervene to get accounts back online!
- Added a Controller
getBotsPerProxy()
function to enable finding least used proxies - Added the advancedconfig
relogTimeout
setting to customize the 15 minutes default setting - Added proxy support to the Controller
checkConnection()
helper and added asplitProxyString()
helper to Controller.misc - Added DataManager
checkProxy()
andcheckAllProxies()
helper functions to updateisOnline
for every proxy - Added a Bot
switchProxy()
function to relog a bot account with a different proxy without needing a restart
- Added a (stripped down for now) developer wiki
- Added a dataIntegrity check to the DataManager to automatically recover corrupted source files by checking their checksum
- The bot can now recover itself from only the initial
start.js
file. Impressive, right?
- The bot can now recover itself from only the initial
- Added support for setting specific games for specific accounts. Suggestion in #193
- Added a scripts directory
- Added the langStringsChangeDetector script to generate the lang keys updated list for each changelog
- Added the generateFileStructure script to update
/src/data/fileStructure.json
- Added the checkTranslationKeys script to find missing or misnamed lang keys in translations
- Added a contributing wiki page
- Added 351 more quotes to default quotes.txt file @8c #210
- Added compatibility feature for update from 2.13 to 2.14
Reworks:
- Reworked
customlang.json
structure to work with the new language system. Please read the updated customlang wiki page! - Reworked how variables are set in language strings to easily distinguish them from normal text. They now follow this syntax:
${variableName}
- Reworked how proxies are loaded and stored in the DataManager to store connection status information
- They are now stored in an array of objects instead of a string array and contain the properties
proxy
,proxyIndex
,isOnline
&lastOnlineCheck
- They are now stored in an array of objects instead of a string array and contain the properties
- Reworked how the logininfo is stored in the DataManager to fix an invalid account order when a username consisting of only numbers was provided
- The accounts are now stored in an array of objects instead of an object with the username as key
- Reworked bot accounts password protection in
!eval
- Reworked
advancedconfig.json
by adding dummy values that act as separators to group certain settings together - Reworked Updater's
customUpdateRules()
to carry removed config & advancedconfig values through an update- The corresponding compatiblity feature must handle the processing & removal of these values
- Replaced all writeFile() calls with DataManager write helper calls
- Replaced every lang usage with
data.getLang()
- Improved
!settings
command array & object conversion - Improved log for first time user when installing dependencies
- Improved creating plugins, accounts setup and config setup guide
- The
controller.restart()
function now automatically sets default params if undefined to simplify usage - DataManager's dataCheck now returns a string containing information when a config value has been reset to default
- The
!settings
command now handles this setting change rejection by informing the user
- The
- Generalized a few lang strings to make translation easier
Fixes:
- Fixed parent process not setting process title when restarting after automatic dependency installation
- Fixed
checkAndGetFile()
failing if npminteraction.js helper is missing - Fixed npminteraction helper failing if package.json is missing
- Fixed dataManager failing if helpers are missing
- Fixed dataCheck failing if DataManager helpers were not replaced quick enough
- Fixed compability feature check failing if folder is missing
- Fixed handleErrors.js failing if npminteraction.js is helper is missing
- Fixed
dataIntegrity()
resolving too fast when restart is needed - Fixed weird infinite loop crash in
syncLoop()
when callingnext()
too fast - Fixed missing game licenses check not working when cache.json is empty
- Fixed dataCheck not resetting change of setting which triggered a promise rejection
- Fixed up-/downvote error detection in sharedfiles libraryPatch for
!vote
&!downvote
commands - Fixed sharedfile comment error detection in sharedfiles libraryPatch
- Fixed compatibility check not finding anything due to typo
- Fixed undefined playing status in ready message when config.playingGames = []
- Fixed the connection check in the Controller not being awaited properly on startup
- Fixed handleMissingGameLicenses only filtering the main account
- Fixed
getBots()
not supporting OFFLINE filter - Fixed invalid account order when a username consisting only numbers was provided by changing how the logininfo is stored (see above)
Changes:
- Removed library patch for re-enabling primaryGroup profile setting #287 & #307 as the PR was merged
- Removed machineName from logOnOptions. The bot will no longer identify itself when logging into an account
- The bot now longer stops itself when the main account looses connection as the relogging helper takes over
- The bot now only runs botsgroup and missing game licenses checks on the intial login of a bot account, no longer also on relogs
- Create accounts.txt file in dataImport if it is missing
- Miscellaneous log improvements (e.g. less newlines, less messages without dates)
- Renamed
config.json
keyscommentdelay
,commentcooldown
,maxComments
&maxOwnerComments
torequestDelay
,requestCooldown
,maxRequests
,maxOwnerRequests
to apply to all request types - Renamed
advancedconfig.json
keyrelogTimeout
tologinRetryTimeout
.relogTimeout
is now used inhandleRelog
. - Renamed
defaultlang.json
insrc/data/lang/
toenglish.json
- Updated dataCheck to support the new language system
- Updated
!help
command response to include voting, favorizing and following request types - Updated wiki pages related to new or changed features
- Updated dependencies
- Minor other changes
A lot of language strings have changed because the variable syntax has been improved. This list is long, to see it click me
- These language keys have been added:
- langname
- commentunsupportedtype
- genericnoaccounts
- genericrequestless
- genericnotenoughavailableaccs
- followprocessstarted
- followsuccess
- helpcommentowner
- helpcommentuser
- helpvote
- helpfavorite
- helpfollow
- langcmdsupported
- langcmdnotsupported
- langcmdsuccess
- settingscmdcouldnotconvert
- settingscmdvaluere...
Version 2.13.6
Additions:
- The !info command now logs amount of loaded plugins instead of maxComments & commentdelay settings
- Added support for reloading data from the disk using the !reload command
Fixes:
- Fixed error on loading sharedfiles when breadcrumbs are incomplete
- Fixed bot waiting for user object of skipped accounts which aren't last to be populated
- Fixed soft-lock with infinite error spam caused by user object populated check if lastBot is undefined
- Fixed possibility of a duplicate handleExpiringTokens interval when DataManager's _importFromDisk() function is called multiple times
Changes:
- Reworked how commands accept and use message sender IDs to greatly improve plugin support:
- Removed the steamID64 parameter and replaced it with resInfo.userID
- Commands do not (and must not) expect a userID property to be provided anymore
- Commands will now handle an unavailable default behavior when command is called from outside the Steam Chat using resInfo.fromSteamChat (e.g. !comment 5 commenting on the requester's profile)
- Added resInfo.ownerIDs to enable privilege checking when using command from outside the Steam Chat
- Added
resInfo
typedef to commandHandler
- Wiki: Added runCommand() example and added note about userID & ownerIDs parameters
- Increased next login attempt delay on login timeout to hopefully prevent further "Already logged on" errors
- Improved sharedfile type detection
- Improved !info & !help whitespace regex to only match spaces at the line start
- Attempted to align secondary values in !info command response to improve readability
- The !settings command will now show the currently loaded config instead of reading it from the disk
- Updated all command names to always have the primary one at first position
- Updated all old wiki links
- Updated dependencies
- Minor other changes
Version 2.13.5
Additions:
- Aggregate old config files for plugins @DerDeathraven #188
- Added arguments documentation to all commands
- Added command descriptions from wiki to all commands
- Added data export functions to DataManager to write all data files back to the disk
- Added JsDoc eslint rules and enforced them
- Added Command and CommandArg typedef in CommandHandler
Fixes:
- Potentially fixed SteamCommunity library scraping sharedfile error caused by non-English page being returned by Steam
- Fixed reload not clearing plugin cache when using 'npm link' @DerDeathraven #192
- Fixed reload not clearing plugin cache of subfolders
- Fixed plugins reading core commands on load getting an empty array because
_importCoreCommands()
wasn't being awaited
Changes:
- Wiki: Updated Integrating into your app and Creating Plugins @DerDeathraven #189
- Wiki: Rewrote Steam Limitations page, rewrote Integrating into your app page, updated various command descriptions, added missing step to npm link explanation and more misc improvements
- Plugin data handling functions will now throw errors on missing parameters
- Data Check will now throw errors instead of rejecting with a string
- Cleaned up a few unnecessarily nested promises
- Enforced lowercase primitive types in JsDocs
- Updated every mention of my old username
- Updated dependencies
- Minor other changes
Note: The russian translation added by @Blueberryy in #186 will be noted in Version 2.14.0 with the upcoming improved language system.
Version 2.13.4
Additions:
- Added REST API plugin written by @DerDeathraven to default packages list
- Added function to PluginSystem to delete files from their plugin data folder
- Added proper handling of requesting >50 missing game licenses from Steam
Fixes:
- Fixed account loosing connection (changing status) during active request throwing error because the account could not be found anymore
- Fixed non-owners not being permitted to use !abort and !failed commands for group & sharedfiles requests that they started
- Fixed !failed command throwing error when providing non-profile ID
- Fixed destructuring response of getUserCooldown() helper in comment command throwing error when database request fails
- Fixed reloadPlugins() throwing error for plugins missing unload() function
- Fixed error on plugin import causing subsequent error on load
- Fixed login() "changed status" log message showing EStatus enum number instead of human readable string
- Fixed !abort and !failed messages not mentioning sharedfiles
Changes:
- Request commands (comment, vote, favorite) will now log request start messages before the first iteration to avoid unintuitive log behaviour if the first iteration fails
- The PluginSystem will now only display warnings (e.g. missing unload() function) for enabled plugins
- "Last account logged in, waiting for user object to populate" message will now show the index of the affected bot account
- Minor README.md improvements
- Updated dependencies
- Minor other changes