ThunderED - Powerful EVE Online Discord Bot with HR and notifications


  • Added Timers auth to Web Config Editor
  • Added new !listroles, !addrole and !remrole commands (read below)
  • Added new HR module param ValidateTokensWhileLoading
  • Added icons to HR users list when user don’t have or have invalid ESI token
  • Added new module - Web Config Editor with basic functionality
  • Added new tags to KM templates: {victimAllyOrCorpName}, {victimAllyOrCorpTicker}, {attackerAllyOrCorpName}, {attackerAllyOrCorpTicker}, {constName}, {regionName}, {isSoloKill}, {isAwoxKill}, {iskFittedValue}
  • Fixed HR module confirmation popups to work with Bootstrap 4.3
  • Fixed possible exception during cache cleanup
  • Fixed Preliminary auth without ESI permissions
  • Fixed HR module not displaying characters whithout ESI
  • Fixed contract duplicate when using multiple filters
  • Fixed several auth errors
  • Fixed processing of characters whom has been deleted form EVE
  • Fixed config editor naming for !ships command
  • Fixed contracts processing incl. initial ongoing contracts catchup
  • Fixed cyrillic text in char application notifications
  • Fixed accepted courier contracts handling
  • Improved !ships command to accept group or ship name as the last param. Examples: !ships who online dreads !ships all moros
  • Updated 3rd party libraries
  • Updated Discord library to 2.1.0 release (might fix some exceptions)


It is now possible for users to self assign/remove Discord roles from the predefined list.
Enable this feature in CommandsConfig using EnableRoleManagementCommands parameter and set roles list using the RolesCommandDiscordRoles parameter.
Use RolesCommandAllowedRoles to specify Discord roles eligible for these commands. Leave empty to allow everyone.

!listroles - lists available roles
!addrole - adds selected role to message author
!remrole - removes selected role from message author


New WebConfigEditor module allows you to edit and save Simplified Auth file from the web page. This file is used to manage authentication.
More features will be added in the future releases.


  • Renamed !caps command into !ships command
  • Renamed EnableCapsCommand, CapsCommandDiscordChannels, CapsCommandDiscordRoles to their Ships counterpart


  • Added UsePortInUrl param to WebServerModule to be able to disable port usage for some connectivity scenarios
  • Added console warning messages for entities that has not been recognized
  • Added new IndustrialJobsModule
  • Added Discord roles validity checks for majority of modules
  • Added !test km command for admins to be able to test KM templates
  • Added new Contracts module property StopOnFirstFilterMatch which is false by default
  • Added new auth mode: authentication by corp Titles
  • Added new auth group poperties UpgradeGroupNames and DowngradeGroupNames (read below)
  • Fixed ContractsFeedModule initial cache generation
  • Fixed contracts availability filter
  • Fixed log verbosity order so Module value is going below the Warning
  • Fixed notification text parsing routine
  • Fixed standings auth being interpreted as guest failing to move forward
  • Fixed several possible exceptions in !corp command
  • Fixed hard coded address in web config templates
  • Rewrote helpClist language file string to reflect recent update
  • Remove .php endings from all URLs. They were obsolete from the very begining :slight_smile:
  • Who’s ordered some !vodka ?
  • Updated platform to .NET Core 2.2
  • Updated Discord library to V2.1.1
  • Improved and updated !clist command to include filtering by type and availability. Read command help for details.
  • Improved and updated defult KM messages (thanks to @mrurb)
  • Improved daily stats info (thanks to @mrurb)
  • Added KM feed groups check and warning for equal group names. Groups must be unque for KM duplicate filters to work correctly.
  • Reworked ZKBSettingsModule.AvoidDupesAcrossAllFeeds property. It will now ban KM after the first usage in any of the KM feeds.
  • Redesigned, improved and enhanced LiveKillFeedModule (read below)
  • Redesigned WebAuthModule to use new entity system allowing both names and IDs to be specified in corresponding properties


LiveKillFeedModule now hosts RadiusKillFeedModule module functionality. It is also has been significantly improved to provide agile filtering.
On top of the existing features now you can:

  • Setup detailed filters using the entity system where both ID and names are allowed
  • Filter by victim ship type list
  • Filter by SOLO, GROUP, AWOX, NOTAWOX, PVP, PVE tags
  • Filter by attackers and victims separately
  • Filter by maximum KM isk value
  • Exclude any entity from search by specifying leading - sign
  • Redirect feed to multiple channels for every filter
  • Choose inclusive or exclusive filtering modes
  • Specify custom template filename for feed Group to use

Read for details.


It is now possible to authenticate characters by assigned corporation titles. Look for Mode7_AuthByTitles in default config file.
Several rules:

  • Titles auth is only enabled when Titles property within AllowedMembers group is not empty
  • Auth group must fetch esi-characters.read_titles.v1 ESI permission from users
  • DiscordRoles property from AllowedMembers will be ignored
  • Corp directors will not be authenticated as they don’t have corp titles


You can now specify a list of additional group names for auth group in an UpgradeGroupNames and DowngradeGroupNames properties. These groups will be checked during an auth check pass.

  • Upgrade: If user will match a group from the list it will be transferred to this auth group. Discord roles will be assigned according to the new group rules.
  • Downgrade: If user do not match it’s current group criteria he will be checked against all groups in the list and will be transferred to first group that is matching criteria. Discord roles will be assigned according to the new group rules.

Note that if new group has ESI permissions specified the user will not have them this way. Moreover ESI permissions obtained from previous groups will be maintained.


  • Bot has been updated to .NET Core 2.2 so you might have to adjust your environment
  • Removed RadiusKillFeedModule and corresponding settings. Its functionality has been merged into LiveKillFeedModule
  • Redesigned LiveKillFeedModule settings section, please take a look and update
  • Contracts cache will be flushed to correct some inconsistencies. First contracts check will fill the cache.
  • WebAuth module:
    • Replaced AllowedCharacters, AllowedCorporations, AllowedAlliances with AllowedMembers
    • Renamed underlying Id prop to Entities
  • REMOVE .php ENDING FROM YOUR CALLBACK URL IN CCP APP! It is no longer needed and will cause validation error.


  • Added new notifications, some with temp placeholder until I get real notification information
  • Added web server status reporter, new param ServerStatusPort. Query specified port to get status (no response - bot is not running). Set to 0 to disable.
  • Added web server NoStatusResponseOnDiscordDisconnection param to not respond on status queries if Discord id not connected. Act like bot is not running.
  • Added ability to assign roles to members without corp titles
  • Added new config property UseSingleFileForLogging to enable logging into single file
  • Added new property to log feeder SendInterval which is default to 5000 msec
  • Added new web auth param EnableDetailedLogging for better auth tracing
  • Added new AutoClearAuthCommandsFromDiscord property to web auth module to cleanup auth requests
  • Added new RemoveAuthIfTokenIsInvalid property to web auth group to remove auth for users with invalid ESI tokens
  • Added new RemoveTokenIfTokenIsInvalid property to web auth group to remove token from user auth data if it is invalid
  • Added new AuthTakeNumberOfUsersPerPass property to web auth module allowing to specify how many users are checked per pass
  • Added new EnforceSingleTickerPerUser for web auth module to force users to have ally or corp ticker
  • Added new ConcurrentThreadsCount property to be able to control number of threads for parallel processes. Usually 4-8 up to one per CPU core.
  • Added KM template vars {systemID}, {constID}, {regionID}, {victimID}, {victimCorpID}, {victimAllyID}, {attackerID}, {attackerCorpID}, {attackerAllyID}
  • Fixed standings in config editor
  • Fixed minor bugs and made some updates to config editor
  • Fixed async logging issues
  • Fixed timers authentication with empty Entities lists
  • Greatly improved and refactored web auth module for better maintenance and performance
  • Greatly improved log feeder for better coverage, less CPU and network utilization
  • Improved HR module to strip roles when user is moved to dumpster
  • Improved HR module to proceed with auth check right after character has been deleted from the web page
  • Improved standings update to a fail-resistant version
  • Colorized important log feeder posts (desktop Discord client only)


  • Automatic KM templates has been removed. Now you have to specify template file for each KM group manually or leave empty for default.
  • Added new entries to Resources config section
  • Replaced SystemLogFeederSettings.OnlyErrors with SystemLogFeederSettings.LogSeverity
  • Renamed web auth group UseStrictAuthenticationMode to StopSearchingOnFirstMatch
  • New rules to follow for auth setup:
    • Auth groups will be checked according to their order in config file: top to bottom. Independent of the auth type (general, standing, titles, etc.).
    • Allowed members in auth groups will be checked from top to bottom with the following priority: character, corporation, alliance
    • Guest groups should go last in the list or they will be chosen before latter groups
    • Guest groups must have empty Entities list (no more 0)!
    • StopSearchingOnFirstMatch now properly limits the search. If it is false when all members within a single group will be checked. This will allow to assign roles to user from multiple AllowedMembers entries form ONE group matching the criteria. If mentioned property is true then only the first matching entry will be used to grant roles. The same rules applies to standings auth.
    • If user matches several criteria within the group and they contain Titles: only the 1st found entry with Titles auth will be selected and all other matches will be omitted

Does anyone offer hosting for this?

Cheapest and most popular VM offers:

1 Like

Дайте расшаренный бесплатный сервер пожалуйста

V1.4.3 has been out for a while. Had no time to update the topic.


  • Added new auth module property AuthCheckUnregisteredDiscordUsers to be able to switch off unregistered users checks
  • Fixed timers web page access malfunction
  • Fixed auth check entries selection based on time
  • Fixed kill feed to correctly use template file for radius kills
  • Fixed missing KMs
  • Fixed chat relay dependencies
  • Made unregistered Discord user checks linear to reduce Discord server load

Still healthy. Looking forward to jump to v1.4.5 release.


  • Added Hidden param to auth groups to hide their buttons but allow to participate in upgrade logic
  • Added automatic SQLite DB backup logic with new settings SqliteBackupFrequencyInHours and SqliteBackupMaxFiles
  • Added comAllowedChannels param to specify allowed channels. All other channels and comForbiddenChannels param will no have effect if comAllowedChannels has any value
  • Added price to compact contracts notification mode
  • Added IP address fetch for authenticating users for future security measures
  • Fixed OrbitalReinforced notification date
  • Fixed config editor LiveKillFeedModule write
  • Fixed war inherited notification
  • Improved simplified auth entries to be written ahead of the original ones to avoid guest filters conflict
  • Improved contracts module performance
  • Improved HRM auth to check user through multiple access lists
  • Improved ChatRelay to send messages in chunks to improve performance
  • Improved web settings editor to apply auth changes on the fly
  • Updated basic contract messages content
  • Decomissioned FleetUp module

@Captain_Panther This looks like a great tool, nice work. I am after a very basic thing not sure if you can do it with your tool. I have a character that gets donations, I was looking for a tool that simple posts a pre-formatted message in my discord when a donation has been received, is this possible with your tool?


  • Added IsEnabled properties for auth, killfeed, contract, config editor, stats, HRM, mail, null campaigns, sov tracker, industrial groups and lists. You can now switch them off.
  • Reworked LiveKillFeed module (again) for better usability
  • Fixed search quieries to ESI
  • Fixed ZKB errors due to server request limitations
  • Updated .NET Core to v3.1


  • Redesigned LiveKillFeed module filters for better usability. Check default config file for new properties and explanations.

    Here’s the quick breakthrough:

    • Filters are now work under ‘AND’ rule by default. Items in lists are always work under ‘OR’ rule (read PS).
    • HasNo props has been added instead of minus sign logic. They are always checked before any other values and will filter out KMs on match
    • HasAttackerEntities and HasVictimEntities work under ‘OR’ rule by default. Set EnableStrictPartiesCheck to enable ‘AND’ rule for these props.
    • EnableMatchOnFirstConditionMet will match the filter on the first ‘Has’ prop condition match
    • MinimumIskValue and MaximumIskValue props validates independently and are not affected by any modifiers.

    PS: ‘OR’ rule - at least one must match, ‘AND’ rule - all must match

Does this allow tracking to Triglavian invasions?

I don’t think this is possible at the moment.

PLEASE update the documentation in your GitHub repository. It is out of date, particularly with regards to the “AllowedMembers” section, and there are some critical details missing with regard to roles and auth and discord roles.

New release is on the schedule I guess


  • Added !sys shutdown and !sys restart commands
  • Added user IP address info on the character panel in HR module
  • Added UseOneAuthButton and AuthButtonDiscordText props for Industry and Contracts modules
  • Added options to use one auth button for Industry and Contract feed registration. Will require both personal and corp ESI permissions to store in DB.
  • Added new KM feed filters ShowHighsecSystem, ShowLowsecSystem, ShowNullsecSystem, ShowWormholeSystem, ShowAbyssSystem
  • Added new section to Notification Feed Filter called SpecialSettings with new special properties to tweak notifications
  • Added EnableStrictShipTypesCheck LiveKillFeed property
  • Fixed and reworked market price module to work with Fuzzworks data
  • Fixed potential role stripping failure
  • Fixed auth standings check from several characters
  • Fixed !char command incorrect values
  • Fixed static command char in web pages
  • Fixed unexpected tickers removal
  • Fixed LiveKillFeed ship type checks
  • Fixed potential auth problems in large discord guilds
  • Fixed ZKB queries
  • Improved KM to track and filter by attacker ships
  • Improved shutdown procedures to avoid possible DB corruption
  • Improved !sys command set. Use !sys help for more info
  • Improved !reauth command to check all the users in Discord
  • Moved Mail, Notifications, Incursions, SovTracker and Contracts modules to entities system
  • Made KM template variables case insensitive


It is now possible for bot to work with several guilds in a limited manner. Auth always works against single guild Id specified in config for now.
But now you can feed messages into channels in other guilds where this bot has been added as a user. Just specify them in config, guild will be found automatically.
Added new properties to restrict commands on secondary guilds: DiscordAllowGeneralCommandsOnSecondaryGuilds and DiscordAllowSystemCommandsOnSecondaryGuilds
WARNING: Overlapping Discord role names can give users access to system commands in other guilds. But you must know bots secret number to add it to your group.


This release introduces new executable: Restarter. It is top-level executable which should be started instead of ThunderED.dll.
It provides the following benefits:

  • Support for correct shutdown procedures
  • Support for !sys restart command
  • Automatic restart upon bot app failure. Requires the app/process to close without additional notifications, e.g. under Windows it requires fail window to be disabled in system policies.
    How to enable:
  • Uncomment ENTRYPOINT ["dotnet", "Restarter.dll"] in Dockerfile and comment the ENTRYPOINT ["dotnet", "ThunderED.dll"]
  • In case of manual startup just run the Restarter.exe


We have new Discord command !sys shutdown. It will perform gracefull shutdown procedure with minimal risks to corrupt DB.
For the Docker users it also provides a possibility to replace shutdown with gracefull restart:

  • Run container with the --restart always flag
  • Send !sys shutdown command from Discord
  • The bot will terminate the app process and container will be restarted along with the new app process!


  • WebAuth module will now be suspended if it is unable to resolve all the char/corp/alliance entities in auth groups on bot startup (no auth checks, existing users will remain intact). Red error message is displayed in the console/logs and Discord message is sent into the AuthReportChannel channel (if it is specified) in case of the failure.
    To fix the problem you must remove/update failing entities and restart the bot. If the case is happened due to very hard ESI failure you must restart the bot and see if it breaks through the problem.
  • Removed HasShipEntities and HasNoShipEntities props
  • Added HasAttackerShipEntities, HasNoAttackerShipEntities, HasVictimShipEntities and HasNoVictimShipEntities props to track attacking ships also
  • Moved UseHTTPS prop to webServerModule. It will be used in the next gen server version.
  • Removed authButtonDiscordText,authButtonNotifyText,authButtonTimersText lang strings and added AuthButtonDiscordText config props to WebAuth, Notifications and Timers modules for default button names
  • Replaced CharacterIds prop with CharacterEntities in Contracts module Groups. It now support entities.
  • Replaced Id prop with CharacterEntities in Mail module Groups. It now support entities.
  • Replaced AuthGroups prop with Groups in Mail module for consistency
  • Replaced CharacterId prop with CharacterEntities in Notifications module
  • Replaced HolderAlliances prop with HolderAllianceEntities in Sov Tracker module
  • Replaced Regions, Constellations, Systems props with LocationEntities in Sov Tracker module
  • Replaced Regions, Constellations props with LocationEntities in Null Campaign module
  • Replaced Regions, Constellations props with LocationEntities in IncursionNotifications module
  • Added EnableStrictShipTypesCheck LiveKillFeed property, all ship types check are now using OR rule by default (like victim and attacker entities)

Nice piece of software, a little fiddly to setup and the documentation could be updated as some have mentioned above (especially the AllowedMembers section). Otherwise impressed and going to gradually expand our use of this if all goes well!

1 Like


  • Fixed mail auth
  • Fixed !stat command
  • Improved Discord connection stability