If you really want it to be entirely separate, you could use a combination of webhooks to deliver events to your bot and the HTTP requests API to have your bot make changes in Discourse.
As @merefield alludes to though, it is possible to create plugins that do not override core functionality, instead being notified for events and interacting with core APIs, which are easier to maintain and less likely to have unwanted side effects.
Going the webhook/API route also requires setting up a stack to run your bot and ensuring that it is always available while Discourse is available, both of which come for free with a plugin loaded into Discourse.
Writing a plugin would require learning Ruby and gaining some familiarity with Discourse classes but if you’re already capable of writing and maintaining a bot in something else, I’m sure you could learn what’s needed pretty quickly.