##Screenshot / Code Snippet
@Adrian I respond to these commands:
(do|do/2|do/red|do/boron) expression "evaluates Rebol/Rebol-like expression in a sandboxed interpreter"
(hello|goodbye|morning) some-text "returns a greeting to the user who greeted bot"
delete [ silent ] "in reply to a bot message will delete if in time"
do/ideone which-lang [word! string! integer!] expression "evaluates a source expression for the specified language"
help "this help"
present[?] "prints users currently online"
private session [ in ] room-number "Starts a private session with the bot in another room."
save key [string! word!] description [string!] link [url!] "save key with description and link"
keys "returns known keys"
remove key "removes key (authorized user)"
find descript [string! word!] "shows keys with description containing descript"
save my details url! [ timezone [time!]] "saves your details with url +/- timezone"
show [all ][ recent ] links by user "shows links posted in messages by user"
show links [ like url ] "shows saved links"
show me your youtube videos "shows saved youtube videos"
version "version of bot"
what is the (meaning|purpose) of life? "answers the biggest question of all"
what is the time?
who do you know "returns a list of all known users"
who is user "returns user details and page"
? key [ for user | @user ] "Returns link and description"
##About
RebolBot is a chat bot written in Rebol. Itwith a natural English dialect interface, specifically targetstargeting the StackOverflow chat rooms. Yet it has a modular design, butcan post tweets to Twitter, and could be modified with only a little effort to work with any chat system that provides an API for accessing and posting messages or with those providing nothing more than a web form (of course its functionality would depend on how much of theother chat activity is accessible either through the API or by scraping). You might think that this is what you could do in any language, but wait until you've seen Rebol - it makes text (and binary) parsing and data munging child's playsystems.
A running An instance of the bot hangs out in the Rebol[Rebol and REDRed] room, where it answers questionsruns under its own account.
There are many features, including logging the chats in a database and providing additional searchability. But especially useful on SO is that it executes Rebol (and IDEone supported languages) code in a sandboxed environment for teaching and testing purposes. For instance, and does all sorts of other useful thingsaddressing the bot with the following input (using shift-enter to generate chat newlines)
@RebolBot
code: [1 +]
append code 2
do code
Will cause it to reply with:
== 3
The bot can currently do evaluations for any language supported by ideone.com. It has a natural English language dialected interface However, and aimssince Rebol is its "native tongue", arbitrary expressions from other languages need to be on call 24/7enclosed in a string literal, as those languages may have different parse rules. It runs under its own account Do note that asymmetric curly braces can be used in Rebol for string constants, which {allows {matched pairs of braces} without escaping, not to mention "quotes AND apostro'phes"}
@RebolBot do/ideone ruby {
puts "You need curly braces, though this specific case could parse as Rebol."
}
Source is available on GitHub. Help It is available incurrently under 400 lines for the main bot Rebol and RED room(not including command modules which can be included or not, as desired). Commands vary from a couple of lines to around 130 for the most complex.
##Screenshot / Code Snippet
Addressing the bot in chat with:
@RebolBot help
Will produce:
I respond to these commands
Note: []
means optional input or shows expected datatype, (|)
means choice:
( do | do/2 | do/red | do/boron ) expression
"evaluates Rebol/Rebol-like expression in a sandboxed interpreter"
( hi | hello | goodnight | goodbye | bye | [ good ] [ night | morning | afternoon | evening ]) some-text
"returns a greeting to the user who greeted bot"
cc id
"retrieves curecode data"
delete [ loud ] "in reply to a bot message will delete if in time"
do/ideone which-lang [word! string! integer!] expression
"evaluates a source expression for the specified language"
fetch id
"retrieves stored JSON message by its message-id"
help "this help"
present[ ? ] "prints users currently online"
private session [ in ] room-number
"Starts a private session with the bot in another room."
save key [string! word!] description [string!] link [url!]
"save key with description and link"
keys "returns known keys"
remove key "removes key (requires authorized user)"
find descript [string! word!]
"shows keys with description containing descript"
save my details url! [ timezone [ time! ] ]
"saves your details with url +/- timezone"
search key
"retrieves all messages in store that contains key"
show ( me | all ) links [like url
] "shows saved links (like url, if provided)"
show me your youtube videos "shows saved youtube videos"
show [ me ][ recent ] links ( by | from ) user
"shows links posted in messages by user"
source name
"provides Rebol source for named function"
tweet [12345678 | "string"]
"Sends tweet of message number or string as @rebolbot"
version "version of bot"
what is the ( meaning | purpose ) of life? "answers the biggest question of all"
what is the time?
who do you know "returns a list of all known users"
who is user
"returns user details and page"
? key [ for user | @user ]
"Returns link and description"
##About
The bot runs as a console process and can interact with a chat systems in various ways with ease. As As implemented it is using the REST API that is visible, but (but not documented,) when you use chat.stackoverflow.com. It can reflect on itself, and will provide its own source code on questioning.
If you'd like to use this bot to evaluate code in an arbitrary programming language, you should have access to a remote service that can accept a string to be evaluated. To see what the RebolBot does with the HTML that is returned from the remote service it is currently using, take a look at the evaluate-expression
evaluate-expression
function. In fact the remote service This doesn't have to be a service"service" in a formal sense - any of the many REPLs out there could serve as an evaluation target since Rebol makes it very easy to post. But please: before sending traffic to and parse results from anya site. Make from the bot, make make sure you have the OK of the site owner though, before you go and send more traffic his way than s/he's expecting.
And the latest version can now reflect on itself, and will provide its own source code on questioning. (Quick shout out to Ideone for giving RebolBot a free extended requests API key!)
Keep in mind that this bot is quite young so you can still expect some rough edges to show themselves here and there. Again Again, you are welcome to drop by the Rebol chat room and discuss the script in general, or have us try to help with customizing it for your needs.
RebolRebol (and RedRed) - keepin' it simple!
###Changes
v0.0.33 -
The bot now uses a dynamic, modular approach in providing functionality. Commands are separate modules (a single file) that can be added or removed to change the bot's behavior either before the bot is run or at runtime. There is no configuration needed. The bot will monitor the command modules that are placed in the commands directory and re-configure himself.
Script source on GitHub
Rebol BinariesRebol Binaries - So tiny! Yes, that's all you'll need. No install.
###Platform
The The script can be run on any platform supported by Rebol (Linux, OS X, Windows, Android)
Adrian Sampaleanu on GitHub; Adrian Sampaleanu on SO chat
##Code
RebolBot is currently under 400 lines of Rebol for the main bot (not including command modules which can be included or not, as desired). Commands vary from a couple of lines to around 130 for the most complex. If you want to hack on it, feel free to fork the source and submit pull requests for changes you feel are generally useful, as well as for bug fixes.
Script source on GitHub
##The Goal
Rebol and Red are fighting software complexity...
Software systems have become too complex, layers upon layers of complexity, each more brittle and vulnerable to failure. In the end software becomes the problem, not the solution. We rebel against such complexity, fighting back with the most powerful tool available: language itself.