Skip to content

Releases: aichaos/rivescript-go

v0.4.0 - Aug 15, 2023

16 Aug 03:39
Choose a tag to compare

This update will modernize the Go port of RiveScript bringing some of the newer features that were available on the JavaScript or Python ports.

The ?Keyword Command

This update adds support for the newer ?Keyword command in RiveScript.

This command works around a Unicode matching bug that affected the Go, JavaScript and Python ports of RiveScript. For example:

// You wanted this trigger to match if "你好" appears anywhere
// in a user's message, but it wasn't working before.
+ [*] 你好 [*]
- 你好!

// Now: use the ?Keyword command in place of +Trigger
? 你好
- 你好!

The optional wildcard [*] syntax didn't work when paired with Unicode symbols because the regular expression that [*] is turned into (which involves "word boundary" or \b characters) only worked with ASCII latin characters. The ?Keyword command works around this by translating into a +Trigger that tries every combination of literal word, wildcard on either or both sides, and optional wildcard, to ensure that your keyword trigger will indeed match your keyword anywhere in the user's message.

CaseSensitive User Message Support

By default RiveScript would always lowercase the user's message as it comes in. If this is undesirable and you'd like to preserve their actual capitalization (when it gets captured by wildcards and comes out in their <star> tags), provide the new CaseSensitive boolean to your RiveScript constructor:

bot := rivescript.New(&rivescript.Config{
    CaseSensitive: true,

The built-in rivescript command line program adds a -case parameter to enable this option for testing:

rivescript -case /path/to/brain

JavaScript Object Macros

The official JavaScript object macro support library has a couple of exciting new updates.

Firstly, the JavaScript engine has been replaced from with which should provide a better quality of life for writing JavaScript functions for your bot. Goja supports many of the modern ES6+ features including the let and const keyword and arrow functions.

Additionally, the Goja runtime will be exposed at the .VM accessor for the JavaScriptHandler class, so you can directly play with it and set global variables or Go functions that can be called from your JavaScript macros in your bot, allowing for much greater extensibility.

Other Changes

  • Add shellword parsing for <call> tags: you can pass "quoted strings" in which will go in as one 'word' in the args array, instead of the arguments being literally split by space characters. This brings the Go port of RiveScript in line with the JavaScript port which has been doing this for a while.
  • Fix the rsts_test.go to properly load from the RSTS (RiveScript Test Suite) git submodule.

v0.3.1 - Aug 20, 2021

21 Aug 01:25
Choose a tag to compare

This release simply adds a go.mod to this project so that it gets along well with modern Go projects.

The attached release artifacts contain:

  • The rivescript or rivescript.exe binary from this project. Usage is like rivescript <path/to/files.rive>
  • The eg examples, including eg/brain which holds the example brain.
  • For Windows, run example.bat which easily runs the command rivescript.exe eg/brain to quickly start testing the RiveScript bot.
  • README, LICENSE, and Changes files.

For the source code, go get or download the repo .zip from GitHub.

v0.3.0 - Apr 30, 2017

01 May 02:31
Choose a tag to compare

This update brings some long-needed restructuring to the source layout of
rivescript-go. Briefly: it moves all source files from the src/ subpackage
into the root package namespace, and removes the wrapper shim functions (their
documentation was then moved to the actual implementation functions).

API Breaking Changes

  • The subpackage has been removed, and
    all of the things you used to import from there can now be found in the root
    package instead. Most notably, the RiveScript struct needed to be imported
    (again) from the src subpackage for use with Go object macros.

    To update source code where you used Go object macros:

      import (
    -     rss ""
      func main() {
          bot = rivescript.New(nil)
    -     subroutine := func(rs *rss.RiveScript, args []string) string {
    +     subroutine := func(rs *rivescript.RiveScript, args []string) string {
              return "Hello world"
          bot.SetSubroutine("hello", subroutine)
  • rivescript.Version is now a string constant (replacing VERSION). The
    instance method Version() has been removed.


  • All RiveScript unit tests have been removed in favor of those from the
    RiveScript Test Suite. The test file
    rsts_test.go implements the Go test runner, and the rsts repo was added
    as a Git submodule.
  • The Git commit hash is now encoded into the front-end command line client,
    printed along with the version number in the welcome banner.

v0.2.0 - Feb 7, 2017

08 Feb 05:28
Choose a tag to compare

This update focuses on bug fixes and code reorganization.

screenshot from 2017-02-07 21-35-31

API Breaking Changes

  • rivescript.New() and the Config struct have been refactored. Config
    now comes from the rivescript package directly rather than needing to
    import from rivescript/config.

    For your code, this means you can remove the aichaos/rivescript-go/config
    import and change the config.Config name to rivescript.Config:

    import ""
    func main() {
        // Example defining the struct to override defaults.
        bot := rivescript.New(&rivescript.Config{Debug: true})
        // For the old `config.Basic()` that provided default settings, just
        // pass in a nil Config object.
        bot = rivescript.New(nil)
        // For the old `config.UTF8()` helper function that provided a Config with
        // UTF-8 mode enabled, instead call rivescript.WithUTF8()
        bot = rivescript.New(rivescript.WithUTF8())
  • Reply(), SortReplies() and CurrentUser() now return an error value
    in addition to what they already returned.


  • Add ANSI colors to the RiveScript shell (cmd/rivescript); they can be
    disabled with the -nocolor command line option.
  • Add new commands to the RiveScript shell:
    • /debug [true|false] to toggle the debug mode (/debug will print
      the current setting of debug mode).
    • /dump <topics|sorted> to print the internal data structures for the
      topics and sorted trigger sets, respectively.
  • Separate the unit tests into multiple files and put them in the rivescript
    package instead of rivescript_test; this enables test code coverage
    reporting (we're at 72.1% coverage!)
  • Handle module configuration at the root package instead of in the src
    package. This enabled getting rid of the rivescript/config package and
    making the public API more sane.
  • Code cleanup via go vet
  • Add more documentation and examples to the Go doc.
  • Fix @Redirects not working sometimes when tags like <bot> insert capital
    letters (bug #1)
  • Fix an incorrect regexp that makes wildcards inside of optionals, like [_],
    not matchable in <star> tags. For example, with + my favorite [_] is *
    and a message of "my favorite color is red", <star1> would be "red" because
    the optional makes its wildcard non-capturing (bug #15)
  • Fix the <star> tag handling to support star numbers greater than <star9>:
    you can use as many star numbers as will be captured by your trigger (bug #16)
  • Fix a probable bug within inheritance/includes: some parts of the code were
    looking in one location for them, another in the other, so they probably
    didn't work perfectly before.
  • Fix RemoveHandler() to make it remove all known object macros that used that
    handler, which protects against a possible null pointer exception.
  • Fix LoadDirectory() to return an error when doesn't find any RiveScript
    source files to load, which helps protect against the common error that you
    gave it the wrong directory.
  • New unit tests: object macros.
  • An internal optimization that allowed for cleaning up a redundant storage
    location for triggers that have %Previous commands (PR #20)

v0.1.0 - Dec 11, 2016

12 Dec 00:00
Choose a tag to compare

This update changes some function prototypes in the API which breaks backward
compatibility with existing code.

  • API Breaking Changes:
    • rivescript.New() now takes a *config.Config struct to configure the
      instance. This is now the preferred way to configure debug mode, strict
      mode, UTF-8, etc. rather than functions like SetUTF8().

      For RiveScript's default settings, you can do rivescript.New(config.Basic())
      or rivescript.New(nil). For UTF-8 support, rivescript.New(config.UTF8())
      is a convenient config template to use.

    • GetDepth() and SetDepth() now use a uint instead of an int. But
      these functions are deprecated anyway.

    • GetUservars() and GetAllUservars() return *sessions.UserData objects
      instead of map[string]string for the user data.

    • ThawUservars() now takes a sessions.ThawAction instead of a string to
      specify the action. Valid values are Thaw, Discard, or Keep
      (constants from the sessions package).

  • Deprecated Functions:
    • Configuration functions (getters and setters). Use the Config struct
      when calling rivescript.New(*config.Config) instead:
      • SetDebug(), SetUTF8(), SetDepth(), SetStrict()
      • GetDebug(), GetUTF8(), GetDepth(), GetStrict()
  • Changes:
    • Add support for pluggable session stores for user variables. The default
      one still keeps user variables in memory, but you can specify your own
      implementation instead.

      The interface for a SessionManager is in the sessions package. The
      default in-memory manager is in sessions/memory. By implementing your own
      session manager, you can change where RiveScript keeps track of user
      variables, e.g. to put them in a database or cache.

    • Make the library thread-safe with regards to getting/setting user variables
      while answering a message. The default in-memory session manager implements
      a mutex for accessing user variables.

v0.0.3 - Sept 28, 2016

29 Sep 08:08
Choose a tag to compare

This update was all about restructuring the internal source code to make certain
internal modules exportable for third party users (e.g. the parser) and to
reduce clutter from the root of the git repo.

  • Massive restructuring of the internal source code:
    • Tidied up the root of the git repo by moving all of the implementation
      code into the src/ subdirectory and making the root RiveScript module a
      very lightweight API wrapper around the code. Note: do not import the
      src package directly. Only go through the public API at the root module.
    • Added public facing Parser submodule:
      It enables third party developers to write applications that simply parse
      RiveScript code and getting an abstract syntax tree from it.
    • Moved exported object macro helpers to

Alpha 0.0.2 - April 17 2016

18 Apr 01:47
Choose a tag to compare

This is an alpha release of RiveScript-Go, version 0.0.2, including distributables for Linux and Windows.