gdchamal / squircy2

Scriptable golang IRC bot

Home Page:http://squircy.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

squIRCy2

the scriptable IRC bot

squIRCy2 is written in Go and is scriptable using Javascript.

It sports a web management interface for writing scripts and bot management, as well as dynamic script reloading at runtime. Bind custom scripts to run when events occur in the application. Events can come from IRC, the CLI, or even the web.

Installation

Installing squIRCy2 is as easy as running:

go get -u github.com/tyler-sommer/squircy2

With squIRCy2 is installed, you can run it immediately with squircy2 and a default configuration will be initialized in ~/.squircy2.

For information on modifying and customizing squircy2 itself, see CONTRIBUTING.md.

Configuration

Once the bot is up and running, you can access the web management interface via localhost:3000.

The Settings page allows you to modify squishy's nickname, username, and which server he connects to. Configure the Owner nickname and hostname to your information. These values are available from within each scripting language at runtime.

The Owner Nickname and Hostname settings are available within your scripts.

From the Scripts page, you can add and edit scripts.

From the Dashboard page, you can see CLI and IRC history.

From the REPL, you can write, run, and see the result of code.

Scripting

squIRCy2 embeds a Javascript interpreter, allowing you to write scripts to implement various bot behaviors.

Javascript API

otto supports ECMAScript 5, less a regular expression incompatibility. Additionally, the following functions are available to interact with the various squIRCy2 modules:

Method Description
Irc.Join(channel) Joins the given channel
Irc.Part(channel) Parts the given channel
Irc.Privmsg(target, message) Messages target with message. Target can be a user or a channel
Irc.CurrentNick() Get the bot's current nickname
Irc.Nick(newNick) Change the bot's nickname
Http.Get(url, ...headers) Fetch the given url using a GET HTTP request
Http.Get(url, body, ...headers) Fetch the given url using a POST HTTP request
Http.Send(options) Send an HTTP request with the configured options.
Math.Rand() Generate a random value from 0-1
Math.Round(val) Round val to 0 decimal places.
Config.OwnerNick() Get the configured Owner Nickname
Config.OwnerHost() Get the configured Owner Host
bind(eventName, fnName) Add a handler of the given event type and function name
unbind(eventName, fnName) Removes a handler of the given type and function name
setTimeout(fnName, delay) Executes fnName after delay milliseconds
setInterval(fnName, delay) Executes fnName every delay milliseconds
use(coll) Opens and returns a repository for the given collection

Repository methods

These are methods available on a repository returned by use.

Method Description
repo.Fetch(id) Attempts to load and return an entity with the given id
repo.FetchAll() Returns a collection of all the entities in the repository
repo.Save(entity) Saves the given entity

Event handlers

Event handlers can be registered with bind and unbind. Bind takes two parameters: the name of the event, and the name of the function to call when the given event is triggered.

Event handlers receive an Event object with additional information. An example Javascript handler:

function handler(e) {
    // e is an object with all the transmitted event details
}

Binding a handler

An event handler can either be a named function, or more commonly, a function itself.

bind("irc.PRIVMSG", function(e) {
    console.log("Received message from "+e.Nick);
});

// or
function privmsgHandler(e) {
    console.log("Received message from "+e.Nick);
}
bind("irc.PRIVMSG", privmsgHandler);

Unbinding a handler

To unbind a handler, you must retain a reference to that function. Generally this means keeping a reference to the original handler around.

function privmsgHandler(e) {
    if (e.Nick == "Someone") {
        // Unbind after Someone sends a message
        unbind("irc.PRIVMSG", privmsgHandler);
    }
}
bind("irc.PRIVMSG", privmsgHandler);

Events

Event Name Description
cli.INPUT Input received from terminal
cli.OUTPUT Output sent to terminal
irc.CONNECTING Fired when first connecting to the IRC server
irc.CONNECT Successfully connected to the IRC server
irc.DISCONNECT Disconnected from the IRC server
irc.PRIVMSG A message received, in a channel or a private message
irc.NOTICE A notice received
irc.WILDCARD Any IRC event

The IRC module also fires any IRC code as irc.<code>, for example 001 is irc.001, or NICK is irc.NICK.

Example Scripts

Join channels on connect

bind("irc.CONNECT", function(e) {
    Irc.Join('#squishyslab')
});

Identify with Nickserv

In the example below, a handler is bound to the irc.NOTICE event. When NickServ notices you, requesting you identify, it will reply with your password.

function handleNickserv(e) {
    if (e.Nick == "NickServ" && e.Message.indexOf("identify") >= 0) {
        Irc.Privmsg("NickServ", "IDENTIFY superlongandsecurepassword");
        console.log("Identified with Nickserv");
    }
}
bind("irc.NOTICE", handleNickserv);

When your handler function is invoked, an object (e in the example) is passed as the first parameter. This object has different properties depending on the event.

Iterate over an event's properties

bind("irc.WILDCARD", function(e) {
    for (var i in e) {
        console.log(i+": "+e[i]);
    }
});

Additional Info

squIRCy2 leverages go-irc-event for IRC interaction. It makes use of martini for serving web requests and dependency injection. Tiedot is used as the storage engine. squIRCy2 embeds the otto Javascript VM. Finally, it uses the stick templating engine for rendering HTML templates.

About

Scriptable golang IRC bot

http://squircy.com

License:MIT License


Languages

Language:Go 77.2%Language:HTML 22.0%Language:CSS 0.8%